如何在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
提交
取消
