1
Sunshine
2024-11-05 1ec0f818f512186b3af02637906632264fe97119
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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();
    }
 
 
}