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

2022-08-16  本文已影响0人  王月亮17

写代码的时候经常会用到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)
上一篇下一篇

猜你喜欢

热点阅读