Кодировка Java String (UTF-8)
Я столкнулся с этой строкой старого кода, который я пытаюсь выяснить:
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
Насколько я понимаю, это кодирование и декодирование с использованием одного и того же charSet.
Как это отличается от следующего?
String newString = oldString;
Есть ли сценарий, в котором две строки будут иметь разные выходы?
p.s: Просто пояснить, да, я знаю отличную статью о кодировании Джоэла Спольского!
Ответы
Ответ 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);
минус тонкая разница по кодировке, которую Питер Лори объясняет в своем ответе.