在 java 9 之前,.properties 文件必须在 ISO-8859-1 中编码真的是真的吗?

Nor*_*ert 2 java encoding properties-file

我经常读到 .properties 文件应该/必须在 Java 9 之前以 ISO-8859-1 编码。我从来没有遇到过以 UTF-8 加载和存储 .properties 的问题。还是建议 Resource Bundle 文件只使用 8859-1 ?

public static void utf8_test()
{
    Path pfile    = Paths.get("C:\\temp_\\properties_utf8.properties");
    Path pfileOut = Paths.get("C:\\temp_\\properties_utf-8_out.properties");
    Properties props = new Properties();

    try ( BufferedReader br = Files.newBufferedReader(pfile,StandardCharsets.UTF_8);
          BufferedWriter bw = Files.newBufferedWriter(pfileOut,StandardCharsets.UTF_8)
        )
    {
        props.load(br);
        props.setProperty("test","test prop;??????? ?? ????????;öüµäß@;Euro sign;€");
        props.list(System.out);

        props.store(bw,"comment");

    } catch (Exception e) { e.printStackTrace(); }
} //--- end

The input file is:
foo = aaa
utf_test = ???????
bar = bbb

The output file is:
#comment
#Wed Dec 25 15:11:28 CET 2019
utf_test=???????
bar=bbb
?foo=aaa
test=test prop;??????? ?? ????????;öüµäß@;Euro sign;€
Run Code Online (Sandbox Code Playgroud)

Sla*_*law 6

属性文件

这是Properties(Java 13)的类文档:

load(Reader)/store(Writer, String)方法加载和存储属性从和向基于字符的流中的一个简单的面向行的格式指定的下方。load(InputStream)/store(OutputStream, String)方法的工作方式相同load(Reader)/store(Writer, String)对,除了输入/输出流在ISO 8859-1字符编码进行编码[加上强调]。不能直接用这种编码表示的字符可以使用Java™ 语言规范第 3.3 节中定义的 Unicode 转义来编写;'u'转义序列中只允许一个字符。

loadFromXML(InputStream)storeToXML(OutputStream, String, String)方法和负载在一个简单的XML格式存储属性。默认情况下使用 UTF-8 字符编码,但如果需要,可以指定特定的编码。实现需要支持 UTF-8 和 UTF-16,并且可能支持其他编码。XML 属性文档具有以下 DOCTYPE 声明:[...]

这是Properties#load(InputStream)(再次,Java 13)的文档:

从输入字节流中读取属性列表(键和元素对)。输入流采用 中指定的简单面向行的格式,load(Reader)假定使用 ISO 8859-1 字符编码[强调];即每个字节是一个 Latin1 字符。不在 Latin1 中的字符和某些特殊字符使用The Java™ Language Specification 的第 3.3 节中定义的 Unicode 转义符在键和元素中表示。

此方法返回后,指定的流保持打开状态。


资源包

虽然这里是PropertyResourceBundle(再次,Java 13)的类文档:

API注意事项:

PropertyResourceBundle可以从表示属性文件的anInputStream或 a构造ReaderPropertyResourceBundle从构造一个实例InputStream要求输入流以 UTF-8 编码。默认情况下,如果在读取输入流时发生aMalformedInputException或 an UnmappableCharacterException,则PropertyResourceBundle实例重置为异常之前的状态,重新读取 ISO-8859-1 中的输入流,并继续读取。如果系统属性java.util.PropertyResourceBundle.encoding设置为“ISO-8859-1”或“UTF-8”,则仅以该编码读取输入流,并在遇到无效序列时抛出异常。如果指定了“ISO-8859-1”,则不能用 ISO-8859-1 编码表示的字符必须由Java™ 语言规范第 3.3 节中定义的 Unicode 转义符表示而另一个采用 a 的构造函数Reader则没有这个限制。此系统属性的其他编码值将被忽略。初始化此类时会读取和评估系统属性。初始化后更改或删除属性没有任何影响。

正是这个班级发生了变化。如果您查看Java 8 文档,PropertyResourceBundle您会发现它仅在使用InputStream.

  • 事实上,“Properties”具有接受“Reader”或“Writer”的方法,这就是此类不需要更改的原因。相反,当您使用“ResourceBundle.getBundle(…)”并且它自动从资源构造“PropertyResourceBundle”时,您没有用于指定编码的 API。 (2认同)