如何在Java中替換不可打印的Unicode字符?以下將替換ASCII控制字符(簡寫為[\x00-\x1F\x7F]):my_string.replaceAll("\\p{Cntrl}", "?");以下內(nèi)容將替換所有ASCII不可打印字符(簡寫[\p{Graph}\x20]),包括重音字符:my_string.replaceAll("[^\\p{Print}]", "?");但是,它們都不適用于Unicode字符串。有沒有人有一個(gè)很好的方法從unicode字符串中刪除不可打印的字符?
3 回答

小怪獸愛吃肉
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
my_string.replaceAll("\\p{C}", "?");
查看有關(guān)Unicode正則表達(dá)式的更多信息。java.util.regexPattern
/ String.replaceAll
支持他們。

蝴蝶刀刀
TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
Op De Cirkel大部分都是對(duì)的。他的建議在大多數(shù)情況下都有效:
myString.replaceAll("\\p{C}", "?");
但如果myString
可能包含非BMP代碼點(diǎn),則會(huì)更復(fù)雜。 \p{C}
包含的代理代碼點(diǎn)\p{Cs}
。上述替換方法有時(shí)會(huì)替換代理對(duì)的一半,從而破壞非BMP代碼點(diǎn)。這可能是Java錯(cuò)誤而不是預(yù)期的行為。
使用其他組成類別是一個(gè)選項(xiàng):
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
但是,不會(huì)刪除不屬于一對(duì)的單獨(dú)代理字符(每個(gè)代理字符都有一個(gè)指定的代碼點(diǎn))。非正則表達(dá)式方法是我知道正確處理的唯一方法\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; }}
添加回答
舉報(bào)
0/150
提交
取消