将编码的unicode字符串转换为Java字符串

将编码的unicode字符串转换为Java字符串,java,unicode,Java,Unicode,json数据中有一个字符串,如下所示: #0023Sat Apr 30 10:46:11 UTC 2016#000a[Interoperability]Interoperability#005c Index=Unknown (R03)#000a[Exif]Shutter#005c Speed#005c Value=1/1999 sec#000a[Exif]Bits#005c Per#005c Sample=8 8 8 bits/component/pixel#000a[Exif]Exposure

json数据中有一个字符串,如下所示:

#0023Sat Apr 30 10:46:11 UTC 2016#000a[Interoperability]Interoperability#005c Index=Unknown (R03)#000a[Exif]Shutter#005c Speed#005c Value=1/1999 sec#000a[Exif]Bits#005c Per#005c Sample=8 8 8 bits/component/pixel#000a[Exif]Exposure#005c Bias#005c Value=0 EV#000a[Exif]Sub-Sec#005c Time#005c Original=00#000a
所有这些#XXXX字都是unicode

如何将其转换为Java字符串

Pattern p = Pattern.compile("#([0-9A-Fa-f]{4})");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    int c = Integer.parseInt(m.group(1), 16);
    m.appendReplacement(sb, String.valueOf((char) c));
}
m.appendTail(sb);
return sb.toString();

这假设#XXXX编码一个UTF-16 Unicode码点。Unicode代码点实际上取代了#XXXX的16位范围。

您可以使用
StringBuffer
,而不是
StringBuffer
,以获得更好的性能。在标准JSON中,Unicode字符是使用
\uxxx
格式的UTF-16代码单位编码的,其中,非BMP代码点使用
\uxxx\uxxx
格式的UTF-16代理。因此,假设这个非标准的
#XXXX
语法遵循类似的规则,这个代码将很好地解码BMP和非BMP代码点,因为Java字符串和字符无论如何都使用UTF-16。@FrankPuffer StringBuilder确实更新更快,但只适用于
StringBuffer
。有趣的是。。。appendReplacement可以同时使用AbstractStringBuilder的超类,我不认为会有任何副作用。@JoopEggen感谢这个解决方案,我在想这样的东西将是我需要的标准JSON使用
\uxxx
来转义Unicode值,而不是
\XXXX
。任何JSON解析器都应该能够自动处理
\uxxx
。如果您的JSON确实包含
#XXXX
,则1)它不是标准JSON,2)您必须手动解析它以解码字符。