/**
* 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]