/**
* 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]
|
网友评论