Вы неправильно понимаете происхождение UnsupportedEncodingException
.
Он генерируется методами, которые принимают имя кодировки в качестве строки. Например, String.getBytes(String)
выдает исключение.
Причина, по которой он генерируется, заключается в том, что JVM не знает, к какой кодировке относится имя. Например, если вы вызвали "".getBytes("flibbly bibbly")
, исключение (почти наверняка) будет сгенерировано, потому что это не имя известной кодировки.
Обратите внимание, что это не имеет никакого отношения к содержимому строки. К лучшему или к худшему (я говорю к худшему), Java не генерирует исключения при кодировании или декодировании символов в / из байтов.
Например, "?"
нельзя представить в ISO-8859-1; но вы можете запросить его байты, и вы получите [63]
, то есть то же самое, что и "?"
.
Точно так же [0xff]
не является допустимой последовательностью байтов в UTF-8, но new String(new byte[]{(byte)0xff}, "UTF-8")
производит "�"
. Ни в том, ни в другом случае не выдается исключение.
( Ideone demo )
Исключение не объявляется как выбрасываемое String.getBytes()
или String.getBytes(Charset)
. Это потому, что у вас уже есть экземпляр Charset
до вызова этих:
- В первом случае, поскольку он использует кодировку JVM по умолчанию - если ее не существует, JVM не сможет запуститься!
- В последнем случае. Потому что вы уже получили кодировку, например от
Charset.forName(String)
. Этот метод выдает исключение; но как только вы получите результат, вам больше не нужно «искать» кодировку, так что нет вероятности, что она станет «неизвестной».