chaîne Java et remplacer le caractère NUL (NULL, ASCII 0)?
Question
Test sur quelqu'un elses le code, j'ai remarqué quelques pages JSP impression géniaux caractères non-ASCII. Prendre un bain dans la source que je trouve cette friandise:
// remove any periods from first name e.g. Mr. John --> Mr John
firstName = firstName.trim().replace('.','\0');
Ne remplacer un caractère dans une chaîne avec un caractère nul même travailler en Java? Je sais que '\0'
mettra fin à une chaîne C. Serait-ce le coupable des personnages géniaux?
La solution
Ne remplacer un caractère dans une chaîne avec un caractère nul même travailler en Java? Je sais que '\ 0' mettra fin à une c-string.
Cela dépend de la façon dont vous définissez ce qui fonctionne. Est-il remplacer toutes les occurrences du caractère cible avec '\0'
? Absolument!
String s = "food".replace('o', '\0');
System.out.println(s.indexOf('\0')); // "1"
System.out.println(s.indexOf('d')); // "3"
System.out.println(s.length()); // "4"
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd'); // "true"
Tout semble bien fonctionner pour moi! indexOf
peut le trouver, il compte dans le cadre de la longueur, et sa valeur pour le calcul du code de hachage est 0; tout est tel que spécifié par la JLS / API.
ne pas travail si vous prévoyez de remplacer un caractère par le caractère nul supprimerait en quelque sorte que le caractère de la chaîne. Bien sûr, il ne fonctionne pas comme ça. Un caractère nul est toujours un caractère!
String s = Character.toString('\0');
System.out.println(s.length()); // "1"
assert s.charAt(0) == 0;
NE FAIT PAS travail si vous attendez le caractère nul de mettre fin à une chaîne. Il est évident à partir des extraits ci-dessus, mais il est aussi clairement spécifié dans JLS (
Autres conseils
devrait être probablement changé à
firstName = firstName.trim().replaceAll("\\.", "");
Est-ce que le remplacement d'un caractère dans une chaîne avec un caractère nul travail, même dans Java?
Non.
Serait-ce le coupable des personnages géniaux?
Il est fort probable.
Je pense que ce devrait être le cas. Pour effacer le caractère, vous devez utiliser replace(".", "")
à la place.
cause des "caractères funky":
System.out.println( "Mr. Foo".trim().replace('.','\0'));
produit:
Mr[] Foo
dans ma console Eclipse, où le [] est affiché comme une boîte carrée. Comme d'autres l'ont, utilisez String.replace()
.