Канонические имена кодировок понятны - вот официальный список : у нас есть Канонические имена для 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.
Верно ли мое предложение?