这是一个基本问题,但我在 SA 上找不到完全相同的副本:
我有这个字符串:
String s = "surname\":\"B\\u00f6rner\"},{\"forename\""
我想得到的是:
String s = "surname\":\"Börner\"},{\"forename\""
有什么方法可以在 Java 中做到这一点?谢谢!
手动删除反斜杠将使 Java 像这样解释 unicode。如果您无法修改从 API 调用收到的字符串,您可以使用:
s = s.replaceAll("\\\\u00f6", "\u00f6");
String s = "surname\":\"B\u00f6rner\"},{\"forename\"" ;
try {
String t = URLDecoder.decode(s, "UTF-8") ;
System.out.println(t) ;
}
catch( Throwable t ) {
t.printStackTrace(System.err) ;
}
输出:surname":"Börner"},{"forename"
正如其他人所说,您必须找到一种方法来删除额外的 \。
只要您不需要 Unicode 基本平面之外的字符,这应该不是很困难:
final Matcher m = Pattern.compile("\\\\u(.{4})").matcher(
"surname\":\"B\\u00f6rner\"},{\"forename\"");
final StringBuffer b = new StringBuffer();
while (m.find())
m.appendReplacement(b, String.valueOf(((char)Integer.parseInt(m.group(1), 16))));
m.appendTail(b);
System.out.println(b);
如果那是 Java 源代码,那么这两个字符串文字的含义完全相同……前提是(在后一种情况下)您告诉 Java 编译器源文件编码的字符集。或者,nativetoascii
命令(带有-reverse
命令)可用于将\uxxxx
文件中的 unicode 转义符转换为本机字符。
如果这些字符串值实际上是字符串值,而不是字符串文字,那么您将需要进行某种运行时转换。(我确信有一个 3rd 方库方法可以做到这一点......)