Возможно, я неправильно понимаю это, но я подумал, что новые String (byte [] bytes, String charset) и String.getBytes (charset) являются обратными операциями?
Не обязательно.
Если входной байтовый массив содержит последовательности, которые не являются допустимыми UTF-8, то первоначальное преобразование может превратить их (например) в вопросительные знаки.Затем вторая операция превращает их в '?'
символы в кодировке UTF-8 ... в отличие от исходного представления.
Это правда, что некоторые символы в Unicode имеют несколько представлений;например, акцентированные символы могут быть одной кодовой точкой или базовой кодовой точкой и акцентной точкой.Однако преобразование туда и обратно между байтовым массивом (содержащим действительный UTF-8) и String должно сохранить последовательности кодовых точек.Он не выполняет какую-либо «нормализацию».
Так какой же безопасный способ передачи массива byte [] в виде String тогда?
самой безопасной альтернативой было бы base64-кодирование байтового массива.Это имеет дополнительное преимущество, заключающееся в том, что символы в строке будут преобразованы в любой набор символов / кодировку, который может представлять латинские буквы и цифры.
Другой альтернативой является использование Latin-1 вместо UTF-8.Однако:
- Существует риск повреждения, если данные будут (например) ошибочно интерпретированы как UTF-8.
- Этот подход недопустим, если «строка» тогдавстроенный в XML.Многие управляющие символы находятся за пределами набора символов XML и не могут использоваться в документе XML, даже закодированы в виде символов.