2010-03-26 9 views
29

Probando el código de otra persona, noté algunas páginas JSP imprimiendo funky caracteres no ASCII. Tomando un baño en la fuente me encontré con este dato:¿El reemplazo de cadena Java y el carácter NUL (NULL, ASCII 0)?

// remove any periods from first name e.g. Mr. John --> Mr John 
firstName = firstName.trim().replace('.','\0'); 

¿Tiene la sustitución de un carácter en una cadena con un carácter nulo incluso trabajar en Java? Sé que '\0' terminará una C-cadena. ¿Sería este el culpable de los personajes funky?

+1

"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

Respuesta

78

¿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.

+2

Ahora, esa es una buena explicación. Y estás usando el enfoque correcto para reemplazar las cosas también :) – BalusC

+1

+1: ¡Muy agradable y muy completo! –

4

¿Tiene la sustitución de un carácter en una cadena con un carácter nulo incluso trabajan en Java?

Sería esto el culpable de los caracteres extraños?

Bastante probable.

4

Creo que debería ser el caso. Para borrar el personaje, debe usar replace(".", "") en su lugar.

+3

Eso es un error de sintaxis. –

+0

Vaya, no lo probé. Voy a corregirlo ahora mismo. –

8

probablemente, deban cambiarse a

firstName = firstName.trim().replaceAll("\\.", ""); 
+0

De hecho, iba a usar esto para solucionarlo. – praspa

+6

El 'replaceAll' es como una almádena aquí. Solo quiere reemplazar un char por una cadena vacía. No desea reemplazar patrones en absoluto. Simplemente use 'replace (". "," ")'. – BalusC

1

Esto causa "caracteres extraños":

System.out.println("Mr. Foo".trim().replace('.','\0')); 

produce:

Mr[] Foo 

en mi consola de Eclipse, donde el [] es se muestra como una caja cuadrada. Como otros han publicado, use String.replace().

Cuestiones relacionadas