«Кодирование исторических имен» против канонических имен, скажем, в качестве аргумента charsetName для InputStreamReader / OutputStreamWriter - PullRequest
0 голосов
/ 13 апреля 2019

Канонические имена кодировок понятны - вот официальный список : у нас есть Канонические имена для java.nio API и Канонические имена дляjava.io API и java.lang API .

1) Но каков список исторических кодировок имен?

OuputStreamWriter Javadoc для getEncoding():

Если кодировка имеет историческое имя, то это имя возвращается;в противном случае возвращается каноническое имя кодировки.

Если этот экземпляр был создан с помощью OutputStreamWriter (OutputStream, String) конструктор , то возвращаемое имя , являющееся уникальным для кодировки, может отличаться от имени, переданного конструктору .

Charset JavaDoc :

Некоторые кодировки имеютисторическое имя, определенное для совместимости с предыдущими версиями платформы Java.Историческое имя кодировки - это либо каноническое имя , либо один из псевдонимов .Историческое имя возвращается методами getEncoding () классов InputStreamReader и OutputStreamWriter.

2) Канонические имена кодировок официальный список гласит, что дляjava.io должно использоваться каноническое имя «UTF8», в то время как «UTF-8» является каноническим именем для нового java.nio.

Но InputStreamReader / OutputStreamWriter принимает аргумент «UTF-8»!

try {
    FileOutputStream stream1 = new FileOutputStream("d:\\file.txt");
    OutputStreamWriter writer1 = new OutputStreamWriter(stream1, "UTF-8");
    System.out.println(writer1.getEncoding());
    writer1.close();
} catch (UnsupportedEncodingException e) {
    System.out.println("wrong encoding detected"); // never triggered
}

Кажется, "UTF-8" распознается нормально, нет UnsupportedEncodingException сработало!

PS Я думаю, что любой API (даже не NIO) сейчас (SE8) может принимать NIO-стиль, а стиль java.lang / java.io называется историческим.Это кажется правдой, по крайней мере, для InputStreamReader / OutputStreamWriter.

Верно ли мое предложение?

...