美文网首页
Java实现Unicode加码和解码的工具类

Java实现Unicode加码和解码的工具类

作者: 王月亮17 | 来源:发表于2022-08-16 07:55 被阅读0次

    写代码的时候经常会用到unicode编码和解码,这里记录一下unicode的工具类。
    其实unicode编码和解码,就是16进制数字和char之间的来回转换。
    先看一下工具类:

    package com.test.test.util;
    
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.lang3.StringUtils;
    
    public class UnicodeUtils {
    
        // 16进制数组
        private static final char[] HEX_CHAR_ARRAY = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f'};
        
        // unicode开始标记
        private static final String UNICODE_START = "\\u";
        
        // 十六进制常量
        private static final int HEX_NUMBER = 16;
    
        //解码
        public static String decode(String unicodeString) {
            if (StringUtils.isBlank(unicodeString) || !unicodeString.contains(UNICODE_START)) {
                return null;
            }
            StringBuilder stringBuilder = new StringBuilder();
            int index, pos = 0;
            while (true) {
                index = unicodeString.indexOf(UNICODE_START, pos);
                if (index == -1) {
                    break;
                }
                for (int i = 3; i < 7; i++) {
                    if (i == 6 || index + i >= unicodeString.length()) {
                        stringBuilder.append((char) Integer.parseInt(unicodeString.substring(index + 2, index + i), HEX_NUMBER));
                        pos = index + i;
                        break;
                    }
                    char nextChar = unicodeString.charAt(index + i);
                    if (!ArrayUtils.contains(HEX_CHAR_ARRAY, nextChar)) {
                        stringBuilder.append((char) Integer.parseInt(unicodeString.substring(index + 2, index + i), HEX_NUMBER));
                        pos = index + i;
                        break;
                    }
                }
            }
            return stringBuilder.toString();
        }
    
        public static String encode(String string) {
            if (StringUtils.isBlank(string)) {
                return null;
            }
            StringBuilder unicodeBuilder = new StringBuilder();
            for (int i = 0; i < string.length(); i++) {
                char nextChar = string.charAt(i);
                unicodeBuilder.append("\\u");
                unicodeBuilder.append(Integer.toHexString(nextChar));
            }
            return unicodeBuilder.toString();
        }
    }
    

    解码的工具方法可能写得有点复杂,是为了兼容符号的unicode码,比如'<'转换之后是\u3c,如果按汉字的固定位数去解码就会有问题。
    如果你有更简洁或者更好用的工具类,欢迎把链接贴到评论区。
    其实核心的代码就一两行,如下:

    // 编码
    String unicodeString = "\\u" + Integer.toHexString('异');
    // 解码(\u5f02)
    char oneChar = (char) Integer.parseInt("5f02", HEX_NUMBER)
    

    相关文章

      网友评论

          本文标题:Java实现Unicode加码和解码的工具类

          本文链接:https://www.haomeiwen.com/subject/bkzmbrtx.html