Java String encoding (UTF-8))

j'ai rencontré cette ligne de code d'héritage, que j'essaie de comprendre:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
<!-Pour autant que je puisse comprendre, c'est encoder et décoder en utilisant le même jeu de caractères.

EN QUOI est-ce différent de ce qui suit?

String newString = oldString;

Est-il un scénario dans lequel les deux lignes différentes sorties?

p. S.: Juste pour clarifier, Oui je suis au courant de la excellent article sur le codage par Joel Spolsky !

17
demandé sur OceanBlue 2012-01-13 20:45:58

2 réponses

cela pourrait être une façon compliquée de faire

String newString = new String(oldString);

ceci raccourcit la chaîne de caractères sous-jacente [] utilisée est beaucoup plus longue.

cependant plus spécifiquement, il vérifiera que chaque caractère peut être encodé en UTF-8.

il y a des "caractères" que vous pouvez avoir dans une chaîne de caractères qui ne peuvent pas être encodés et ceux-ci seraient transformés en ?

tout caractère entre \uD800 et \uDFFF ne peut pas être encodé et sera transformé en '?'

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

imprime

false
22
répondu Peter Lawrey 2012-01-13 17:09:37

en quoi est-ce différent de ce qui suit?

Cette ligne de code ici:

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

construit un nouvel objet String (c.-à-d. une copie de oldString), alors que cette ligne de code:

String newString = oldString;

déclare une nouvelle variable de type java.lang.String et l'initialise pour faire référence au même objet String que la variable oldString.

Est-il un scénario dans lequel les deux lignes différentes qui ont les sorties?

Absolument:

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 (voir commentaire) a raison bien sûr. L'équivalent de

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

String newString = new String(oldString);

moins la différence subtile entre le codage que Peter Lawrey explique dans sa réponse.

4
répondu afrischke 2012-01-13 17:45:31