Похоже, что и cp1251, и cp1252 имеют байтовые значения, которые не соответствуют определенным символам; то есть они "не отображаемы".
Javadoc для String(byte[], String)
говорит это:
Поведение этого конструктора, когда указанные байты недопустимы в данной кодировке, не определено. Класс CharsetDecoder
следует использовать, когда требуется больший контроль над процессом декодирования.
Другие конструкторы говорят это:
Этот метод всегда заменяет последовательности некорректного ввода и непопределяемого символа на строку замены этого набора символов по умолчанию.
Если вы видите, что такого рода вещи случаются на практике, это указывает на то, что либо вы используете неправильный набор символов, либо вам были переданы некоторые неверные данные. В любом случае, это, вероятно, не самая лучшая идея, как если бы не было никаких проблем.
Я пытался выяснить, есть ли способ заставить CharsetDecoder «сохранить» не отображаемые символы, и я не думаю, что это возможно, если вы не хотите реализовать пользовательскую пару декодер / кодировщик. Но я также пришел к выводу, что нет смысла даже пытаться. (Теоретически) неправильно отображать эти не отображаемые символы в реальные кодовые точки Unicode. И если да, то как ваше приложение справится с ними?