¿El reemplazo de un carácter en una cadena con un carácter nulo incluso funciona en Java? Sé que '\ 0' terminará una cadena de caracteres.
Eso depende de cómo se defina lo que está funcionando. ¿Reemplaza todas las ocurrencias del personaje objetivo con '\0'
? ¡Absolutamente!
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"
¡Todo parece funcionar bien para mí! indexOf
puede encontrarlo, cuenta como parte de la longitud, y su valor para el cálculo del código hash es 0; todo es como lo especifica el JLS/API.
NO funciona si espera reemplazar un carácter con el carácter nulo de alguna manera eliminará ese carácter de la cadena. Por supuesto que no funciona así. ¡Un personaje nulo sigue siendo un personaje!
String s = Character.toString('\0');
System.out.println(s.length()); // "1"
assert s.charAt(0) == 0;
También NO SE trabajo si espera que el carácter nulo para terminar una cadena.Es evidente a partir de los fragmentos anteriores, pero también se especifica claramente en JLS (10.9. An Array of Characters is Not a String):
En el lenguaje de programación Java, a diferencia de C, un conjunto de char
no es un String
, y tampoco un String
ni una matriz de char
termina con '\ u0000' (el carácter NUL).
Sería esto el culpable de los caracteres extraños?
Ahora estamos hablando de una cosa completamente diferente, es decir, cómo se reproduce la secuencia en la pantalla. La verdad es que, incluso "¡Hola mundo!" se verá funky si usa la fuente dingbats. Una cadena Unicode puede parecer funky en una configuración regional pero no en la otra. Incluso una cadena unicode debidamente procesada que contenga, por ejemplo, caracteres chinos, puede parecer funky para alguien de, por ejemplo, Groenlandia.
Dicho esto, el carácter nulo probablemente se verá funky independientemente; por lo general, no es un personaje que desea mostrar. Dicho esto, dado que el carácter nulo no es el terminador de cadena, Java es más que capaz de manejarlo de una forma u otra.
Ahora hacer frente a lo que suponemos es el efecto deseado, es decir, eliminar todo el periodo de una cadena, la solución más sencilla es utilizar la sobrecarga replace(CharSequence, CharSequence)
.
System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU
La solución replaceAll
se menciona aquí también, pero que funciona con la expresión regular, por lo que necesita para escapar de la metacarácter punto, y es probable que sea más lento.
"Observé algunas páginas JSP que imprimían caracteres funky no ascii": la causa principal de este problema está en otra parte. Google "mojibake". – BalusC