Op De Cirkel çoğunlukla haklı. Önerisi çoğu durumda işe yarayacaktır:
myString.replaceAll("\\p{C}", "?");
Ancak myString
BMP olmayan kod noktaları içerebilirse, o zaman daha karmaşıktır. \p{C}
yedek kod noktalarını içerir \p{Cs}
. Yukarıdaki değiştirme yöntemi, bazen vekil çiftin yalnızca yarısını değiştirerek BMP olmayan kod noktalarını bozar. Bunun amaçlanan davranıştan ziyade bir Java hatası olması mümkündür.
Diğer kurucu kategorileri kullanmak bir seçenektir:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
Ancak, bir çiftin parçası olmayan tek vekil karakterler (her vekil karakterin atanmış bir kod noktası vardır) kaldırılmayacaktır. Düzgün olmayan bir yaklaşım, doğru şekilde işlemeyi bildiğim tek yoldur \p{C}
:
StringBuilder newString = new StringBuilder(myString.length());
for (int offset = 0; offset < myString.length();)
{
int codePoint = myString.codePointAt(offset);
offset += Character.charCount(codePoint);
switch (Character.getType(codePoint))
{
case Character.CONTROL:
case Character.FORMAT:
case Character.PRIVATE_USE:
case Character.SURROGATE:
case Character.UNASSIGNED:
newString.append('?');
break;
default:
newString.append(Character.toChars(codePoint));
break;
}
}