package com.nova.sankuai.infra.utils;
|
|
|
import java.util.regex.Pattern;
|
|
/**
|
* @Author Lilinhong
|
* @Date 2022/7/21 10:00
|
*/
|
public class UnicodeUtil {
|
|
private static final String singlePattern = "[0-9|a-f|A-F]";
|
|
private static final String pattern = singlePattern + singlePattern +
|
|
singlePattern + singlePattern;
|
|
/**
|
* 把 \\u 开头的单字转成汉字,如 \\u6B65 -> 步
|
*/
|
private static String ustartToCn(final String str) {
|
String sb = "0x" +
|
str.substring(2, 6);
|
int code = Integer.decode(sb);
|
char c = (char)code;
|
return String.valueOf(c);
|
}
|
|
/**
|
* 字符串是否以Unicode字符开头。约定Unicode字符以 \\u开头。
|
* @param str 字符串
|
* @return true表示以Unicode字符开头.
|
*/
|
private static boolean isStartWithUnicode(final String str) {
|
if (null == str || str.length() == 0) {
|
return false;
|
}
|
if (!str.startsWith("\\u")) {
|
return false;
|
}
|
// \u6B65
|
if (str.length() < 6) {
|
return false;
|
}
|
String content = str.substring(2, 6);
|
boolean isMatch = Pattern.matches(pattern, content);
|
return isMatch;
|
}
|
|
/**
|
* 字符串中,所有以 \\u 开头的UNICODE字符串,全部替换成汉字
|
* @param str
|
* @return
|
*/
|
public static String unicodeToCn(final String str) {
|
// 用于构建新的字符串
|
StringBuilder sb = new StringBuilder();
|
// 从左向右扫描字符串。tmpStr是还没有被扫描的剩余字符串。
|
// 下面有两个判断分支:
|
// 1. 如果剩余字符串是Unicode字符开头,就把Unicode转换成汉字,加到StringBuilder中。然后跳过这个Unicode字符。
|
// 2.反之, 如果剩余字符串不是Unicode字符开头,把普通字符加入StringBuilder,向右跳过1.
|
int length = str.length();
|
for (int i = 0; i < length;) {
|
String tmpStr = str.substring(i);
|
if (isStartWithUnicode(tmpStr)) {
|
sb.append(ustartToCn(tmpStr));
|
i += 6;
|
} else {
|
sb.append(str.charAt(i));
|
i++;
|
}
|
}
|
return sb.toString();
|
}
|
|
|
}
|