【问题标题】:Is 'the local character set' the same as 'the encoding of the text data you want to process'?“本地字符集”是否与“要处理的文本数据的编码”相同?
【发布时间】:2015-11-17 15:18:31
【问题描述】:

Oracle Java 文档在其对字符流的教程介绍中声明如下:

使用字符流代替字节流的程序会自动适应本地字符集并为国际化做好准备——这一切都无需程序员付出额外的努力。 (http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html)

我的问题与“自动”一词在这种情况下的含义有关。文档警告的其他地方

文本文件中的数据在其编码与 Java 虚拟机的默认文件编码匹配时会自动转换为 Unicode.... 如果默认文件编码与您要处理的文本数据的编码不同,那么您必须自己执行转换。在处理来自另一个国家或计算平台的文本时,您可能需要这样做。 (http://docs.oracle.com/javase/tutorial/i18n/text/convertintro.html)

第一个引号中的“本地字符集”是否类似于第二个引号中的“您要处理的文本数据的编码”?如果是这样,第二个引述是不是爆炸了第一个引述的自夸——除非你需要进行转换,否则你不需要进行任何转换?

【问题讨论】:

    标签: java unicode character-encoding


    【解决方案1】:

    在您链接的第一个教程的上下文中,我读到他们使用“本地字符集”来表示默认字符集。

    例如:

    inputStream = new FileReader("xanadu.txt");
    

    他们正在创建一个FileReader,它不允许您指定Charset,因此将使用JVM 的默认字符集:

    如果你想使用一个显式的字符集,你可以这样写:

    inputStream = new InputStreamReader(new FileInputStream("xanadu.txt"), charset);
    

    【讨论】:

    • 我不同意您对第一个教程的阅读,因为在开始时它说“字符流 I/O 自动将此内部格式转换为本地字符集”,这意味着本地字符集是 JVM 的外部
    • JVM 的默认字符集(由Charset.defaultCharset() 返回)由file.encoding JVM 属性决定——它没有什么神奇之处。这可以在外部指定,例如它是在 JVM 启动时从您的机器环境中获取的,但这就是您的代码获取它的方式。 new FileReader("...") 肯定会创建一个使用 Charset.defaultCharset()FileReader
    • ... 这意味着Charset.defaultCharsetused as the Charset
    • 感谢所有这些。我需要一些时间来解析您提供的信息。目前,我是否可以认为我的实际问题的答案是否定的?
    【解决方案2】:

    没有。本地字符集是文件使用的字符集(字符值和相应代码表),但默认文本编码是 JVM 解释字符的方式(将它们转换为字符代码)。它们相互联系并且非常相似,但并不完全相同。

    此外,它说它“自动”转换它,因为这是 JVM 的功能:它自动将包含您的代码的文本文件中的字符转换为机器可以读取的代码。

    【讨论】:

    • 我明白了。我在问题的原始措辞中有错误,现在已修复,抱歉。我在原始措辞中提到了第二个引用的错误部分。
    猜你喜欢
    • 2017-12-19
    • 2020-02-19
    • 2016-11-03
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多