Java 替换字符串中的 Unicode 字符

Java Replace Unicode Characters in a String

我有一个包含多个 unicode 字符的字符串。我想识别所有这些 un​​icode 字符,例如:\ uF06C,并将其替换为反斜杠和四个没有 "u"[=32= 的十六进制数字]里面。

示例

源字符串:"add \uF06Cd1 Clause"

结果字符串:"add \F06Cd1 Clause"

如何在 Java 中实现这一点?

编辑:

link Java Regex - How to replace a pattern or how to 中的问题与此不同,因为我的问题涉及 unicode 字符。虽然它有多个文字,但它被 jvm 视为一个字符,因此正则表达式将不起作用。

尝试使用 String.replaceAll() 方法

s = s.replaceAll("\u", "\");

正确的做法是使用正则表达式来匹配整个 unicode 定义并使用 group-replacement。

匹配 unicode-string 的正则表达式:

A unicode-character 看起来像 \uABCD,所以 \u,后跟 4 个字符的十六进制数字字符串。可以使用

来匹配这些
\u[A-Fa-f\d]{4}

但这有一个问题:
在像 "just some \uabcd arbitrary text" 这样的 String 中,\u 仍然会匹配。所以我们需要确保 \u 之前有偶数个 \s:

(?<!\)(\\)*\u[A-Fa-f\d]{4}

现在作为输出,我们需要一个反斜杠后跟 hexnum-part。这可以通过group-replacement来完成,所以让我们从分组字符开始:

(?<!\)(\\)*(\u)([A-Fa-f\d]{4})

作为替换,我们希望匹配两个反斜杠的组中的所有反斜杠,后跟一个反斜杠和 unicode-literal:

的 hexnum-part
\

现在是实际代码:

String pattern = "(?<!\\)(\\\\)*(\\u)([A-Fa-f\d]{4})";
String replace = "\\";

Matcher match = Pattern.compile(pattern).matcher(test);
String result = match.replaceAll(replace);

反斜杠太多了!那么,java、正则表达式和反斜杠存在一个问题:反斜杠需要在 java 正则表达式中转义。所以“\\\\”作为 java 中的 pattern-string 匹配一个 \ 作为 regex-matched 字符。

编辑:
在实际字符串中,字符需要被过滤掉并替换为它们的 integer-representation:

StringBuilder sb = new StringBuilder();
for(char c : in.toCharArray())
   if(c > 127)
       sb.append("\").append(String.format("%04x", (int) c));
   else
       sb.append(c);

这假设 "unicode-character" 你的意思是 non-ASCII-characters。此代码将按原样打印任何 ASCII-character,并将所有其他字符输出为反斜杠,后跟 unicode-code。 "unicode-character" 的定义相当模糊,因为 java 中的 char 总是表示 unicode-character。这种方法保留任何 control-chars,如“\n”、“\r”等,这就是我选择它而不是其他定义的原因。