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

com.moon.core.util.UnicodeUtil Maven / Gradle / Ivy

package com.moon.core.util;

import com.moon.core.lang.ThrowUtil;

/**
 * @author moonsky
 */
public final class UnicodeUtil {

    private UnicodeUtil() { ThrowUtil.noInstanceError(); }

    /**
     * 判断一个字符串是否是 Unicode 字符串
     *
     * @param s 待测字符串
     *
     * @return true: 待测字符串是 unicode 字符串
     */
    public static boolean isUnicode(String s) {
        return isFullUnicode(s) || isSimpleUnicode(s);
    }

    /**
     * 判断字符串是否不是 Unicode 字符串
     *
     * @param s
     */
    public static boolean isNotUnicode(String s) {
        return !isUnicode(s);
    }

    /**
     * 将一个 Unicode 字符串转换成普通字符串
     *
     * @param unicode
     */
    public static String toString(String unicode) {
        if (isFullUnicode(unicode)) {
            return toFullString(unicode);
        } else if (isSimpleUnicode(unicode)) {
            return toSimpleString(unicode);
        } else {
            return unicode;
        }
    }

    /**
     * 将一个普通字符串转换为 Unicode 字符串
     *
     * @param string
     */
    public static String toFullUnicode(String string) {
        if (string != null && isNotUnicode(string)) {
            String u = "\\u";
            StringBuilder sb = new StringBuilder();
            for (int i = 0, len = string.length(); i < len; i++) {
                sb.append(u).append(Integer.toHexString(string.charAt(i)));
            }
            return sb.length() == 0 ? null : sb.toString();
        }
        return string;
    }

    /**
     * 将一个普通字符串转换为 Unicode 字符串
     *
     * @param string
     */
    public static String toSimpleUnicode(String string) {
        if (string != null && isNotUnicode(string)) {
            final String u = "\\u";
            StringBuilder sb = new StringBuilder();
            for (int i = 0, len = string.length(); i < len; i++) {
                char ch = string.charAt(i);
                if (ch > 128) {
                    sb.append(u).append(Integer.toHexString(ch));
                } else {
                    sb.append(ch);
                }
            }
            return sb.length() == 0 ? null : sb.toString();
        }
        return string;
    }

    /**
     * 将 Unicode 字符串 采用方式  1 转换为普通字符串,不对外暴露
     *
     * @param source
     */
    private static String toFullString(String source) {
        if (source != null) {
            StringBuilder sb = new StringBuilder();
            String[] arr = source.toLowerCase().split("\\\\u");
            for (int i = 1, len = arr.length; i < len; i++) {
                sb.append((char) Integer.parseInt(arr[i], 16));
            }
            return sb.toString();
        }
        return null;
    }

    /**
     * 将 Unicode 字符串 采用方式  2 转换为普通字符串,不对外暴露
     *
     * @param source
     */
    private static String toSimpleString(String source) {
        if (source != null) {
            StringBuilder sb = new StringBuilder();
            String[] arr = source.toLowerCase().split("\\\\u");
            for (int i = 1, len = arr.length; i < len; i++) {
                String tmp = arr[i];
                if (tmp.length() > 4) {
                    int num = Integer.parseInt(tmp.substring(0, 4), 16);
                    sb.append((char) num).append(tmp.substring(4));
                } else {
                    sb.append((char) Integer.parseInt(tmp, 16));
                }
            }
            return sb.toString();
        }
        return null;
    }

    /**
     * 检测一个字符串是否是一个 Unicode 字符串
     * (纯 Unicode 所有字符都是 Unicode 表示)
     * 不对外暴露
     *
     * @param string
     */
    static boolean isFullUnicode(String string) {
        if (string != null) {
            int len = string.length();
            boolean isNumeric;
            if (len > 0) {
                for (int i = 0; i < len; ) {
                    char ch = string.charAt(i++);
                    if (ch == 92) {
                        ch = string.charAt(i++);
                        if (ch == 85 || ch == 117) {
                            do {
                                ch = string.charAt(i);
                                if (ch != 92) {
                                    if (!(isNumeric = Character.digit(ch, 16) > -1)) {
                                        return false;
                                    }
                                    i++;
                                } else {
                                    isNumeric = false;
                                }
                            } while (isNumeric && i < len);
                            continue;
                        }
                    }
                    return false;
                }
                return true;
            }
        }
        return false;
    }

    /**
     * 检测一个字符串是否是一个 Unicode 字符串
     * ASCII 码是原样表示
     * 不对外暴露
     *
     * @param string
     */
    static boolean isSimpleUnicode(String string) {
        if (string != null) {
            String[] nodes = string.trim().split("\\\\u");
            int length = nodes.length;
            for (int i = nodes[0].length() == 0 ? 1 : 0; i < length; i++) {
                String tmp = nodes[i];
                int len = tmp.length();
                if (len >= 4) {
                    for (int j = 0; j < 4; j++) {
                        if ((Character.digit(tmp.charAt(j), 16) < 0)) {
                            return false;
                        }
                    }
                } else {
                    for (int j = 0; j < len; j++) {
                        if ((Character.digit(tmp.charAt(j), 16) < 0)) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy