美文网首页正则java
java实现unicode与字符串互转

java实现unicode与字符串互转

作者: 修行者12138 | 来源:发表于2020-09-26 18:14 被阅读0次
/**
 * unicode转字符串
 * @param unicodeStr unicode
 * @return 字符串
 */
public static String unicodeToString(String unicodeStr) {
    // XDigit是POSIX字符类,表示十六进制数字,\p{XDigit}等价于[a-fA-F0-9]
    // pattern用于匹配形如\\u6211的字符串
    Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
    Matcher matcher = pattern.matcher(unicodeStr);
    char ch;
    while (matcher.find()) {
        // 捕获组按开括号'('从左到右编号(从1开始),以(A(B(C)))为例,group(1)表示(A(B(C)),group(2)表示(B(C)),group(3)表示(C)
        // group(2)表示第二个捕获组,即(\p{XDigit}{4})
        // Integer.parseInt(str, 16)把16进制的数字字符串转化为10进制,比如Integer.parseInt("16", 16) = 22
        ch = (char) Integer.parseInt(matcher.group(2), 16);
        // 把第一个捕获组,即形如\\u6211这样的字符串替换成中文
        unicodeStr = unicodeStr.replace(matcher.group(1), ch + "");
    }
    return unicodeStr;
}


/**
 * 字符串转unicode
 * @param str 字符串
 * @return unicode
 */
public static String stringToUnicode(String str) {
    StringBuffer sb = new StringBuffer();
    char[] c = str.toCharArray();
    for (int i = 0; i < c.length; i++) {
        // Integer.toHexString把字符串转16进制
        sb.append("\\u" + Integer.toHexString(c[i]));
    }
    return sb.toString();
}

使用示例

@Test
public void test1() throws Exception {
    String str = "今天天气真好";
    String stringToUnicode = stringToUnicode(str);
    String unicodeToString = unicodeToString(stringToUnicode);
    System.out.println(stringToUnicode);
    System.out.println(unicodeToString);
}

输出结果
\u4eca\u5929\u5929\u6c14\u771f\u597d
今天天气真好

附录

POSIX,全称为可移植性操作系统接口,是一种关于信息技术的IEEE标准,其目标是提供一套大体上基于Unix的可移植操作系统标准。
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A-Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

以下是使用java中的正则表达式匹配POSIX字符类的各种示例。

编号 构造 匹配描述
1 \p{Lower} 小写字母字符:[a-z]
2 \p{Upper} 大写字母字符:[A-Z]
3 \p{ASCII} 所有ASCII:[\x00-\x7F]
4 \p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
5 \p{Digit} 十进制数字:[0-9]
6 \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
7 \p{Punct} 标点符号:!”#$%&’()*+,-./:;<=>?@[]^_>{Ι}< 其中一个。
8 \p{Graph} 一个可视的字符: [\p{Alnum}\p{Punct}]
9 \p{Print} 可打印字符:[\p{Graph}\x20]
10 \p{Blank} 空格或制表符:[ \t]
11 \p{XDigit} 十六进制数字:[0-9a-fA-F]
12 \p{Space} 空白字符:[ \t\n\x0B\f\r]

相关文章

网友评论

    本文标题:java实现unicode与字符串互转

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