web-dev-qa-db-fra.com

Java Encodage de chaîne (UTF-8)

Je suis tombé sur cette ligne de code hérité, que j'essaie de comprendre:

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

Autant que je puisse comprendre, il s'agit d'encoder et de décoder en utilisant le même charSet.

En quoi est-ce différent des suivants?

String newString = oldString;

Existe-t-il un scénario dans lequel les deux lignes auront des sorties différentes?

p.s .: Juste pour clarifier, oui je connais le excellent article sur l'encodage par Joel Spolsky !

18
OceanBlue

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

String newString = new String(oldString);

Cela raccourcit la chaîne car le caractère sous-jacent [] utilisé est beaucoup plus long.

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 qui ne peuvent pas être encodés et ceux-ci seraient transformés en ?

Aucun caractère compris entre\uD800 et\uDFFF ne peut ê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));

impressions

false
22
Peter Lawrey

En quoi est-ce différent des suivants?

Cette ligne de code ici:

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

construit un nouvel objet String (c'est-à-dire une copie de oldString), tandis 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.

Y a-t-il un scénario dans lequel les deux lignes auront des sorties différentes?

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"));

est

String newString = new String(oldString);

moins la différence subtile par rapport à l'encodage que Peter Lawrey explique dans sa réponse.

4
afrischke