编码的规范名称很清楚 - 这是官方列表:我们有API的规范名称和APIjava.nio
和API的规范名称。java.io
java.lang
1) 但是历史编码名称列表是什么?
OuputStreamWriter
Javadoc用于getEncoding()
:
如果编码具有历史名称,则返回该名称;否则返回编码的规范名称。
如果此实例是使用OutputStreamWriter(OutputStream, String)构造函数创建的,则返回的名称(对于编码而言是唯一的)可能与传递给构造函数的名称不同。
Charset
Java文档:
某些字符集具有为与 Java 平台的早期版本兼容而定义的历史名称。字符集的历史名称要么是它的规范名称,要么是它的别名之一。历史名称由 InputStreamReader 和 OutputStreamWriter 类的 getEncoding() 方法返回。
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我认为现在(SE8)任何API(甚至非NIO)都可以接受NIO风格,而java.lang/java.io风格被称为历史。至少对于 InputStreamReader/OutputStreamWriter 来说似乎是正确的。
我的提议成立吗?