Преобразование из String в byte[] в String

Я столкнулся с такой строкой Java, где следующее false:

body.equals(new String(body.getBytes()));

Я полагаю, это связано с тем, что конструктор String по умолчанию обрабатывает кодировку тела byte[] как UTF-8, я не уверен на 100%. Как бы я мог сохранить эту строку в байте [] и иметь возможность преобразовать ее позже? Я полагаю, мне нужно определить, в какой кодировке находится byte[]. Как мне это сделать?

Некоторый контекст: мне нужен байт [], чтобы я мог сжать данные, сохранить их в БД, а затем распаковать и превратить несжатый байт [] обратно в исходную строку. Строка изначально поступает из какой-то библиотеки, которая загрузила веб-страницу, и я не уверен, какую обработку они выполняют со строкой, прежде чем передать ее мне.


person Community    schedule 16.10.2012    source источник
comment
возможный дубликат Что такое кодировка символов и почему Я заморачиваюсь с этим   -  person Raedwald    schedule 10.04.2015


Ответы (3)


Просто убедитесь, что вы используете одну и ту же кодировку в обоих случаях — при создании массива байтов из строки и при создании строки из массива байтов.

Итак, ваш пример будет лучше:

body.equals(new String(body.getBytes("utf-8"), "utf-8"));

Это гарантирует, что байты будут поняты независимо от среды.

Вы также должны, почти несомненно, использовать юникод. Если вы выберете однобайтовую кодировку (например, кодовую страницу ISO), вы, вероятно, пожалеете об этом в будущем, даже если существует однобайтовая кодировка, которая удовлетворяет ваши потребности прямо сейчас.

person joelittlejohn    schedule 16.10.2012
comment
Это уже должно иметь место, поскольку в документации для конструктора и getBytes говорится, что они будут использовать кодировку по умолчанию, которая не изменится после запуска виртуальной машины и кэширования кодировки по умолчанию. - person Dunes; 17.10.2012
comment
@Dunes, правда, хотя я предполагал, что реальная примерная строка кода никогда не появляется нигде в реальном приложении - это просто короткая строка, которая показывает как правильный конструктор для использования, так и правильный метод getBytes для вызова. На практике я ожидаю, что эти два вызова разделены по времени и туда и обратно к постоянному хранилищу. В этом случае гораздо безопаснее (в любой среде/платформе) указывать кодировку в обоих вызовах и не полагаться на платформу по умолчанию. Вы абсолютно правы в том, что вам никогда не пришлось бы этого делать, если бы вы действительно использовали именно эту линию в производстве. - person joelittlejohn; 17.10.2012

Кодировка платформы по умолчанию используется для кодирования и декодирования.

Проблема в том, что кодировка может быть ограничена, например. США-ASCII. Если символ в строке находится за пределами этого набора символов, мы его потеряем.

Используйте кодировку, которая охватывает все символы Юникода, например. УТФ-8, УТФ-16.

person irreputable    schedule 16.10.2012

При преобразовании между байтами и символами без указания кодировки поведение зависит от платформы. Используется кодировка по умолчанию, которая распространяется на всю JVM и зависит от вашей системы. Я точно не знаю, что произойдет, если используется кодировка ASCII и у вас есть символы, отличные от ASCII, но я знаю, что вы получите другую строку. Вам нужно указывать кодировку каждый раз, когда вы концертируете, чтобы избежать этого.

person John Watts    schedule 16.10.2012