如何在Java中替换不可打印的Unicode字符?以下将替换ASCII控制字符(简写为[\x00-\x1F\x7F]):my_string.replaceAll("\\p{Cntrl}", "?");以下内容将替换所有ASCII不可打印字符(简写[\p{Graph}\x20]),包括重音字符:my_string.replaceAll("[^\\p{Print}]", "?");但是,它们都不适用于Unicode字符串。有没有人有一个很好的方法从unicode字符串中删除不可打印的字符?
3 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
my_string.replaceAll("\\p{C}", "?");
查看有关Unicode正则表达式的更多信息。java.util.regexPattern
/ String.replaceAll
支持他们。
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
Op De Cirkel大部分都是对的。他的建议在大多数情况下都有效:
myString.replaceAll("\\p{C}", "?");
但如果myString
可能包含非BMP代码点,则会更复杂。 \p{C}
包含的代理代码点\p{Cs}
。上述替换方法有时会替换代理对的一半,从而破坏非BMP代码点。这可能是Java错误而不是预期的行为。
使用其他组成类别是一个选项:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
但是,不会删除不属于一对的单独代理字符(每个代理字符都有一个指定的代码点)。非正则表达式方法是我知道正确处理的唯一方法\p{C}
:
StringBuilder newString = new StringBuilder(myString.length());for (int offset = 0; offset < myString.length();){ int codePoint = myString.codePointAt(offset); offset += Character.charCount(codePoint); // Replace invisible control characters and unused code points switch (Character.getType(codePoint)) { case Character.CONTROL: // \p{Cc} case Character.FORMAT: // \p{Cf} case Character.PRIVATE_USE: // \p{Co} case Character.SURROGATE: // \p{Cs} case Character.UNASSIGNED: // \p{Cn} newString.append('?'); break; default: newString.append(Character.toChars(codePoint)); break; }}
添加回答
举报
0/150
提交
取消