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