Строковое кодирование Java (UTF-8) - PullRequest
18 голосов
/ 13 января 2012

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

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

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

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

String newString = oldString;

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

p.s .: Просто чтобы прояснить, да, мне известна отличная статья о кодировании Джоэля Спольски !

Ответы [ 2 ]

22 голосов
/ 13 января 2012

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

String newString = new String(oldString);

Это сокращает строку, так как используемый символ [] намного длиннее.

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

В строке есть несколько «символов», которые не могут быть закодированы, и они будут преобразованы в ?

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

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

печать

false
4 голосов
/ 13 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...