Op De Cirkel a surtout raison. Sa suggestion fonctionnera dans la plupart des cas :
myString.replaceAll("\\p{C}", "?");
Mais si myString
peut contenir des points de code non-BMP, alors c'est plus compliqué. \p{C}
contient les points de code de substitution de \p{Cs}
. La méthode de remplacement ci-dessus corrompt les points de code non-BMP en ne remplaçant parfois que la moitié de la paire de substituts. Il est possible qu'il s'agisse d'un bogue Java plutôt que d'un comportement voulu.
L'utilisation des autres catégories de constituants est une option :
myString.replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "?");
Cependant, les caractères de substitution solitaires qui ne font pas partie d'une paire (chaque caractère de substitution a un point de code attribué) ne seront pas supprimés. Une approche non-regex est le seul moyen que je connaisse pour traiter correctement les \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;
}
}
2 votes
Juste un addendum : la liste des catégories générales d'Unicode peut être trouvée dans UAX #44
1 votes
Duplicata possible de Le moyen le plus rapide de supprimer tous les caractères non imprimables d'une chaîne Java
1 votes
@Stewart : salut, avez-vous regardé les questions/réponses en dehors du titre ?!?
1 votes
@Stewart : cette autre question ne couvre que le sous-ensemble ascii des caractères non imprimables !!!