Op De Cirkel hat größtenteils recht. Sein Vorschlag wird in den meisten Fällen funktionieren:
myString.replaceAll("\\p{C}", "?");
Wenn myString
es sich jedoch um Nicht-BMP-Codepunkte handelt, ist dies komplizierter. \p{C}
enthält die Ersatzcodepunkte von \p{Cs}
. Die oben beschriebene Ersetzungsmethode beschädigt Nicht-BMP-Codepunkte, indem manchmal nur die Hälfte des Ersatzpaars ersetzt wird. Es ist möglich, dass dies eher ein Java-Fehler als ein beabsichtigtes Verhalten ist.
Die Verwendung der anderen Kategorien ist eine Option:
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
Einzelne Ersatzzeichen, die nicht Teil eines Paares sind (jedem Ersatzzeichen ist ein Codepunkt zugewiesen), werden jedoch nicht entfernt. Ein Nicht-Regex-Ansatz ist der einzige Weg, den ich richtig handhaben kann \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;
}
}