Pregunta

Probando el código de otra persona, noté algunas páginas JSP que imprimen personajes funky no ASCII. Dando un chapuzón en la fuente encontré este dato:

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

¿Reemplazar un personaje en una cadena con un personaje nulo incluso funciona en Java? Yo sé eso '\0' Terminará una C-cadena. ¿Sería este el culpable de los personajes funky?

¿Fue útil?

Solución

¿Reemplazar un personaje en una cadena con un personaje nulo incluso funciona en Java? Sé que ' 0' terminará una C-String.

Eso depende de cómo define lo que está funcionando. ¿Reemplaza todos los acontecimientos 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 me parece funcionar bien! indexOf puede encontrarlo, cuenta como parte de la longitud, y su valor para el cálculo del código hash es 0; Todo está como especificado por la JLS/API.

Eso NO El trabajo si espera reemplazar un personaje con el carácter nulo eliminaría de alguna manera 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 Trabaje si espera que el carácter nulo termine una cadena. Es evidente de los fragmentos de arriba, pero también está claramente especificado en JLS (10.9. Una variedad de caracteres no es una cadena):

En el lenguaje de programación de Java, a diferencia de C, una variedad de char no es un String, y ni un String ni una matriz de char se termina por ' u0000' (el carácter NUL).


¿Sería este el culpable de los personajes funky?

Ahora estamos hablando de algo completamente diferente, es decir, cómo se representa la cadena en la pantalla. La verdad es, incluso "¡Hola mundo!" Se verá funky si usa la fuente Dingbats. Una cadena Unicode puede parecer funky en una ubicación pero no en la otra. Incluso una cadena unicode adecuadamente renderizada que contiene, por ejemplo, los caracteres chinos, aún puede parecer funky para alguien de, digamos, Groenlandia.

Dicho esto, el personaje nulo probablemente se verá funky independientemente; Por lo general, no es un personaje que desee mostrar. Dicho esto, dado que el carácter nulo no es el terminador de cadenas, Java es más que capaz de manejarlo de una forma u otra.


Ahora para abordar lo que suponemos que es el efecto previsto, es decir, eliminar todo el período de una cadena, la solución más simple es usar el replace(CharSequence, CharSequence) sobrecarga.

System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU

los replaceAll La solución también se menciona aquí, pero eso funciona con la expresión regular, por lo que necesita escapar del meta carácter del punto, y es probable que sea más lento.

Otros consejos

Probablemente debería cambiarse a

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

¿Reemplazar un personaje en una cadena con un personaje nulo incluso funciona en Java?

No.

¿Sería este el culpable de los personajes funky?

Muy probable.

Creo que debería ser el caso. Para borrar el personaje, debes usar replace(".", "") en cambio.

Esto causa "personajes funky":

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

produce:

Mr[] Foo

En mi consola Eclipse, donde [] se muestra como una caja cuadrada. Como otros han publicado, usa String.replace().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top