All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.t.util.common.StringUtil Maven / Gradle / Ivy

package cn.t.util.common;


/**
 * 字符集问题
 * 1.不存在使用一个字符集转成成另一个字符集的问题,因为String底层使用char[]存储,只在需要操作byte[]时,转换字节有关
 */
public class StringUtil {


    public static boolean isEmpty(String str) {
        return str == null || str.trim().length() == 0;
    }


    public static boolean isAllNumeric(String str) {
        char[] chars = str.toCharArray();
        if (chars.length == 0) {
            return false;
        } else {
            for (char c : chars) {
                if (c < 48 || c > 57) {
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean hasLength(CharSequence str) {
        return (str != null && str.length() > 0);
    }

    public static boolean hasLength(String str) {
        return (str != null && !str.isEmpty());
    }

    /**
     * StringUtils.hasText(null) = false
     * StringUtils.hasText("") = false
     * StringUtils.hasText(" ") = false
     * StringUtils.hasText("12345") = true
     * StringUtils.hasText(" 12345 ") = true
     * @param str xxx
     * @return xxx
     */
    public static boolean hasText(CharSequence str) {
        if (!hasLength(str)) {
            return false;
        }

        int strLen = str.length();
        for (int i = 0; i < strLen; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    public static boolean hasText(String str) {
        return (str != null && !str.isEmpty() && hasText((CharSequence) str));
    }

    public static boolean containsWhitespace(CharSequence str) {
        if (!hasLength(str)) {
            return false;
        }

        int strLen = str.length();
        for (int i = 0; i < strLen; i++) {
            if (Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    public static String replace(String inString, String oldPattern, String newPattern) {
        if (!hasLength(inString) || !hasLength(oldPattern) || newPattern == null) {
            return inString;
        }
        int index = inString.indexOf(oldPattern);
        if (index == -1) {
            // no occurrence -> can return input as-is
            return inString;
        }

        int capacity = inString.length();
        if (newPattern.length() > oldPattern.length()) {
            capacity += 16;
        }
        StringBuilder sb = new StringBuilder(capacity);

        int pos = 0;  // our position in the old string
        int patLen = oldPattern.length();
        while (index >= 0) {
            sb.append(inString.substring(pos, index));
            sb.append(newPattern);
            pos = index + patLen;
            index = inString.indexOf(oldPattern, pos);
        }

        // append any characters to the right of a match
        sb.append(inString.substring(pos));
        return sb.toString();
    }

    public static String removeEmoji(String src) {
        if (!hasLength(src)) {
            return src;
        }
        byte[] bytes = src.getBytes();
        StringBuilder sb = new StringBuilder();
        int count;
        for (int i = 0; i < bytes.length; i += count) {
            count = countUTF8CharBytes(bytes[i]);
            if (count < 2) {
                sb.append((char) bytes[i]);
                count = 1;
            } else if (count < 4) {
                sb.append(new String(bytes, i, count));
            } else {
                sb.append("*");
            }
        }
        return sb.toString();
    }


    /**
     * 将emoji字符转成Unicode
     * @param src xxx
     * @return xxx
     */
    public static String emojiToUnicode(String src) {
        StringBuilder unicode = new StringBuilder();
        for (int i = 0; i < src.length(); i++) {
            char c = src.charAt(i);
            int codepoint = src.codePointAt(i);
            if (isEmojiCharacter(codepoint)) {
                unicode.append("\\u").append(Integer.toHexString(c));
            } else {
                unicode.append(c);
            }
        }
        return unicode.toString();
    }

    /**
     * 将Unicode字符转成emoji
     * @param src xxx
     * @return xxx
     */
    public static String unicodeToEmoji(String src) {
        if (isEmpty(src)) {
            return "";
        }
        StringBuilder builder = new StringBuilder();
        int length = src.length();
        for (int i = 0; i < length; i++) {
            if (src.charAt(i) == '\\') {
                if ((i < length - 5) && ((src.charAt(i + 1) == 'u') || (src.charAt(i + 1) == 'U'))) {
                    try {
                        builder.append((char) Integer.parseInt(src.substring(i + 2, i + 6), 16));
                        i += 5;
                    } catch (NumberFormatException localNumberFormatException) {
                        builder.append(src.charAt(i));
                    }
                } else {
                    builder.append(src.charAt(i));
                }
            } else {
                builder.append(src.charAt(i));
            }
        }
        return builder.toString();
    }

    /**
     * 判断是否包含Emoji符号
     * @param codePoint xxx
     * @return xxx
     */
    public static boolean isEmojiCharacter(int codePoint) {
        return (codePoint >= 0x2600 && codePoint <= 0x27BF) // 杂项符号与符号字体
            || codePoint == 0x303D
            || codePoint == 0x2049
            || codePoint == 0x203C
            || (codePoint >= 0x2000 && codePoint <= 0x200F)//
            || (codePoint >= 0x2028 && codePoint <= 0x202F)//
            || codePoint == 0x205F //
            || (codePoint >= 0x2065 && codePoint <= 0x206F)//
            /* 标点符号占用区域 */
            || (codePoint >= 0x2100 && codePoint <= 0x214F)// 字母符号
            || (codePoint >= 0x2300 && codePoint <= 0x23FF)// 各种技术符号
            || (codePoint >= 0x2B00 && codePoint <= 0x2BFF)// 箭头A
            || (codePoint >= 0x2900 && codePoint <= 0x297F)// 箭头B
            || (codePoint >= 0x3200 && codePoint <= 0x32FF)// 中文符号
            || (codePoint >= 0xD800 && codePoint <= 0xDFFF)// 高低位替代符保留区域
            || (codePoint >= 0xE000 && codePoint <= 0xF8FF)// 私有保留区域
            || (codePoint >= 0xFE00 && codePoint <= 0xFE0F)// 变异选择器
            || codePoint >= 0x10000; // Plane在第二平面以上的,char都不可以存,全部都转
    }


    public static byte countUTF8CharBytes(byte b) {
        byte offset = 0;
        while (offset < 8) {
            if (((b >> (7 - offset)) & 1) != 1) {
                break;
            }
            offset += 1;
        }
        return offset;
    }

    public static StringPart partUTF8String(String src) {

        byte[] bytes = src.getBytes();
        StringPart stringPart = new StringPart();
        StringBuilder latinCharactersBuilder = new StringBuilder();
        StringBuilder otherCharactersBuilder = new StringBuilder();

        int cursor = 0;
        while (cursor < bytes.length) {
            byte buff = bytes[cursor];
            byte offset = countUTF8CharBytes(buff);
            byte numBytes = (offset == 0 || offset == 1) ? 1 : offset;
            if (numBytes == 1) {
                latinCharactersBuilder.append((char) bytes[cursor]);
            } else {
                byte[] tmp = new byte[numBytes];
                System.arraycopy(bytes, cursor, tmp, 0, numBytes);
                otherCharactersBuilder.append(new String(tmp));
            }
            cursor += numBytes;
        }
        return stringPart
            .setLatinCharacters(latinCharactersBuilder.toString().toCharArray())
            .setOtherCharacters(otherCharactersBuilder.toString().toCharArray());
    }

    public static class StringPart {
        private char[] latinCharacters;
        private char[] otherCharacters;

        public char[] getLatinCharacters() {
            return latinCharacters;
        }

        private StringPart setLatinCharacters(char[] latinCharacters) {
            this.latinCharacters = latinCharacters;
            return this;
        }

        public char[] getOtherCharacters() {
            return otherCharacters;
        }

        private StringPart setOtherCharacters(char[] otherCharacters) {
            this.otherCharacters = otherCharacters;
            return this;
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy