Как преобразовать байтовый массив Cp1252 в правильную строку? - PullRequest
2 голосов
/ 17 июня 2011

Привет, весь код выглядит следующим образом:

File file2 = new File("D://deploy//body.txt");

byte[] bytes = loadFile(file2);
System.out.println(bytes.length);

StringBuffer buffer = new StringBuffer();
InputStream inputStream = new ByteArrayInputStream(bytes);
InputStreamReader reader = new InputStreamReader(inputStream,"CP1252");
Reader in = new BufferedReader(reader);
int ch;
while ((ch = in.read()) > -1) {
    buffer.append((char)ch);
}
in.close(); 
System.out.println(buffer.toString().getBytes().length);

Окончательный результат равен 1576 и 2439 для длины байтовых массивов. Как правильно преобразовать байтовый массив CP1252 в строку и сохранить правильный размер? Спасибо

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Я заметил вашу фразу - "правильная строка" и хотел бы отметить, что в вашем случае нет такой вещи, как правильная или неправильная строка.Это правильная или неправильная кодировка.

Вы читаете последовательность байтов cp1252 байтов и добавляете отдельные символы в буфер.Если исходный файл находится в cp1252, проблем с этим процессом нет.Под капотом InputStreamReader используется CharsetDecoder , который способен декодировать базовую кодировку потока в последовательность из шестнадцати битных символов Unicode (UTF-16).Это сделано, потому что вы читаете символы из потока байтов.

Как указывает bmargulies , когда вы выполняете buffer.toString().getBytes(), вы преобразуете эти последовательности символов UTF-16 впоследовательность байтов, которая имеет ту же кодировку, что и платформа.Поскольку это не cp1252, длины исходного байтового массива и преобразованного не сравнимы.Указание charset для метода getBytes() вызывает использование StringEncoder (это внутренний класс с JVM Oracle / Sun; другие реализации могут использовать другой класс) для преобразования последовательности символов UTF-16 в последовательность байтовв нужной кодировке (cp1252).

2 голосов
/ 17 июня 2011
System.out.println(buffer.toString().getBytes().length);

бессмысленно.Он получает байты в кодировке по умолчанию, которая почти наверняка не cp1252.

Вместо этого попробуйте getBytes("cp1252").

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