2012-01-13 20 views
17

me he encontrado con esta línea de código heredado, lo que estoy tratando de averiguar:String de Java codificación (UTF-8)

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

Por lo que yo puedo entender, se codifican & decodificación mediante el mismo charSet.

¿Cómo es esto diferente de lo siguiente?

String newString = oldString; 

¿Hay alguna situación en la que las dos líneas tendrán diferentes salidas?

p.s .: Solo para aclarar, sí, estoy al tanto del excellent article on encoding by Joel Spolsky!

+8

Bueno, por supuesto, uno * * diferencia es que con 'Cadena newString = oldString;', todavía tiene solamente una copia de la cadena (sólo está señalando de dos variables). La decodificación/codificación hace una * copia * de la cadena. No es que importe mucho, ya que 'String's son inmutables. Sin embargo, probablemente esta no sea la razón por la que ese código antiguo es así; 'String' tiene una forma mucho más directa de clonarse (' String (String) '). No puedo pensar en una * buena * razón por la que harías la codificación/descodificación, aparte de probar los métodos de codificación/descodificación de la clase 'String'. –

+0

¿El contexto da alguna pista de por qué la conversión de cadenas puede haber sido o ha sido necesaria? –

+0

@ T.J.Crowder: +1, por supuesto! No quise decir la diferencia en el objeto real referido. Gracias por señalar eso. – OceanBlue

Respuesta

22

Esto podría complicarse forma de hacer

String newString = new String(oldString); 

Esto acorta la cadena es el carbón subyacente [] utilizada es mucho más largo.

Sin embargo, más específicamente, se comprobará que cada carácter puede ser codificado en UTF-8.

Hay algunos "personajes" que puede tener en una cadena que no pueden ser codificados y éstos se convertirían en ?

Cualquier carácter entre \ uD800 y \ uDFFF no puede ser codificado y se convirtieron en '?'

String oldString = "\uD800"; 
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"); 
System.out.println(newString.equals(oldString)); 

impresiones

false 
+0

¡Fantástico! Gracias. – OceanBlue

+1

El único motivo por el que 'oldString' falla al codificarse correctamente es porque no es una cadena UTF-16 (representación nativa de cadenas en Java) válida para empezar. UTF-8 es totalmente capaz de codificar todos los puntos de código Unicode. En este caso, habría una diferencia solo cuando 'oldString' contenga una secuencia inválida de bytes UTF-16. – Cagatay

4

¿Cómo es esto diferente de lo siguiente?

Esta línea de código aquí:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

construye un objeto nuevo String (es decir, una copia de oldString), mientras que esta línea de código:

String newString = oldString; 

declara una nueva variable de escriba java.lang.String y lo inicializa para hacer referencia al mismo objeto String que la variable oldString.

¿Hay alguna posibilidad de que las dos líneas tengan salidas diferentes?

Absolutamente:

String newString = oldString; 
boolean isSameInstance = newString == oldString; // isSameInstance == true 

vs

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 
// isSameInstance == false (in most cases)  
boolean isSameInstance = newString == oldString; 

a_horse_with_no_name (ver comentario) es correcta, por supuesto. El equivalente de

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

es

String newString = new String(oldString); 

menos el WRT sutil diferencia de la codificación que Pedro Lawrey explica en su respuesta.

+0

'String newString = new String (oldString)' sería equivalente a la línea "original" supongo –