Подтвердить что ты не робот

Кодировка Java String (UTF-8)

Я столкнулся с этой строкой старого кода, который я пытаюсь выяснить:

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

Насколько я понимаю, это кодирование и декодирование с использованием одного и того же charSet.

Как это отличается от следующего?

String newString = oldString;

Есть ли сценарий, в котором две строки будут иметь разные выходы?

p.s: Просто пояснить, да, я знаю отличную статью о кодировании Джоэла Спольского!

4b9b3361

Ответ 1

Это может быть сложный способ сделать

String newString = new String(oldString);

Это сокращает строку, используемую ниже char [].

Однако более конкретно это будет проверка того, что каждый символ может кодироваться в кодировке UTF-8.

Есть несколько "символов", которые вы можете иметь в строке, которая не может быть закодирована, и они будут преобразованы в ?

Любой символ между \uD800 и\uDFFF не может быть закодирован и будет преобразован в '?'

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

печатает

false

Ответ 2

Как это отличается от следующего?

Эта строка кода здесь:

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

создает новый объект String (т.е. копию oldString), а эта строка кода:

String newString = oldString;

объявляет новую переменную типа java.lang.String и инициализирует ее ссылкой на тот же объект String, что и переменная oldString.

Есть ли сценарий, в котором две строки будут иметь разные выходы?

Абсолютно:

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

против.

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

a_horse_with_no_name (см. комментарий), конечно, правильно. Эквивалент

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

является

String newString = new String(oldString);

минус тонкая разница по кодировке, которую Питер Лори объясняет в своем ответе.