Me he encontrado con esta línea de código heredado, que estoy tratando de averiguar:

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

Tal y como yo lo entiendo, que es el de la codificación & decodificación usando el mismo juego de caracteres.

Cómo es esto diferente de lo siguiente?

String newString = oldString;

Hay ningún escenario en el que las dos líneas tienen diferentes salidas?

p.s.: Solo para aclarar, sí, estoy consciente de la excelente artículo sobre la codificación por Joel Spolsky !

  • Bueno, por supuesto, una diferencia es que con String newString = oldString;, usted todavía tiene sólo una copia de la cadena (sólo estás apuntando a ella a partir de dos variables). La decodificar/codificar hace una copia de la cadena. No es que importe mucho, ya que Strings son inmutables. Esto probablemente no es ¿por qué ese viejo código es de esa manera, aunque; String tiene una manera mucho más directa a clonarse a sí mismo (String(String)). No puedo pensar en una buena razón por qué te gustaría hacer la codificación/decodificación, otra de las pruebas de la String de la clase de codificación/decodificación de los métodos.
  • ¿El contexto de dar alguna sugerencia de por qué la cadena de conversión puede tener o había sido necesario?
  • por supuesto! No me refiero a la diferencia en el objeto real se refiere. Gracias por decírmelo.
  • Hay una diferencia importante: uno de ellos no compile 😉
InformationsquelleAutor OceanBlue | 2012-01-13

2 Comentarios

  1. 22

    Esto podría ser complicado de hacer

    String newString = new String(oldString);

    Esto acorta la Cadena es el subyacente char[] se utiliza es mucho más larga.

    Sin embargo, más específicamente, será la comprobación de que cada personaje puede ser codificado en UTF-8.

    Hay algunos «personajes» que puede tener en una Cadena que no puede ser codificado y estos se convertirían en ?

    Cualquier carácter entre \uD800 y \uDFFF no puede ser codificado y se convirtió en ‘?’

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

    imprime

    false
    • La única razón por la oldString no puede codificar correctamente es porque no es válido UTF-16 (nativo de la representación de cadenas de caracteres en Java) de la cadena, para empezar. UTF-8 es plenamente capaz de codificar cualquier y todos los puntos de código Unicode en sí. En este caso, no sería una diferencia sólo cuando oldString contiene una secuencia no válida de UTF-16 bytes.
  2. 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 nuevo objeto String (es decir, una copia de oldString), mientras que esta línea de código:

    String newString = oldString;

    declara una nueva variable de tipo java.lang.String y lo inicializa para referirse al mismo objeto String como la variable oldString.

    Hay ningún escenario en el que las dos líneas tienen diferentes salidas?

    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 el comentario) es cierto, por supuesto. El equivalente de

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

    es

    String newString = new String(oldString);

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

    • String newString = new String(oldString) sería el equivalente a la «original» de la línea supongo

Dejar respuesta

Please enter your comment!
Please enter your name here