写代码的时候经常会用到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)
网友评论