【问题标题】:What is the default encoding of the JVM?JVM 的默认编码是什么?
【发布时间】:2010-11-03 15:00:15
【问题描述】:

UTF-8 是 Java 中的默认编码吗?
如果不是,我怎么知道默认使用哪种编码?

【问题讨论】:

    标签: java encoding character-encoding jvm


    【解决方案1】:

    JVM 的默认字符集是运行它的系统的字符集。这没有特定的值,您通常不应依赖默认编码是任何特定值。

    可以在运行时通过Charset.defaultCharset() 访问它,如果这对您有任何用处,但实际上您应该指出始终明确指定编码

    【讨论】:

    • 如果你是对的,我觉得有点奇怪java.sun.com/javase/technologies/core/basic/intl/… 说它总是 UTF-16。
    • UTF-16 是 JVM 内部表示文本的方式。默认编码决定了 JVM 如何解释从文件中读取的字节(例如使用FileReader)。
    • 这个答案是正确的,但是作为参考,在Linux上它通常是“UTF-8”,而在Windows上它通常是“cp1252”。
    • 我刚刚经历了一个 linux 安装,它从语言环境报告 UTF-8,但 java 说的是 US-ASCII。
    • 错了。检查Charset.defaultCharset() 源代码。它读取 file.encoding 属性,否则使用 UTF-8。
    【解决方案2】:

    请注意,您可以使用名称容易混淆的属性file.encoding 更改 JVM 的默认编码。

    如果您的应用程序对编码特别敏感(可能通过使用暗示默认编码的 API),那么您应该在 JVM 启动时将其显式设置为一致(已知)值。

    【讨论】:

    • 请注意,file.encoding 必须在 JVM 启动时指定(即作为命令行参数 -Dfile.encoding 或通过 JAVA_TOOLS_OPTIONS);您可以在运行时设置它,但这并不重要。见stackoverflow.com/questions/361975/…
    【解决方案3】:

    共有三种“默认”编码:

    • file.encoding:
      System.getProperty("file.encoding")

    • java.nio.Charset:
      Charset.defaultCharset()

    • 以及InputStreamReader的编码:
      InputStreamReader.getEncoding()

    您可以在this page 上阅读更多相关信息。

    【讨论】:

      【解决方案4】:

      要获取默认的 java 设置,只需使用:

      java -XshowSettings 
      

      【讨论】:

        【解决方案5】:

        我确信这是特定于 JVM 实现的,但我能够通过执行“影响”我的 JVM 的默认 file.encoding:

        export LC_ALL=en_US.UTF-8
        

        (在 Ubuntu 12.04 上运行 java 版本 1.7.0_80)

        此外,如果您从 unix 控制台输入“locale”,您应该会在此处看到更多信息。

        所有功劳归http://www.philvarner.com/2009/10/24/unicode-in-java-default-charset-part-4/

        【讨论】:

        • 你是怎么检查的?我找不到证明 Java 对语言环境字符串中的编码给予任何关注的证据。仅来自file.encoding 属性。
        • @ArtemNovikov - 是的,但是file.encoding 的默认值是多少?根据sprops.encoding的值在java.lang.System.initProperties中初始化,其中sprops是本机函数GetJavaProperties()返回的结构体,其实现因平台而异。例如,在 Windows 版本中,它调用 GetUserDefaultLCID(),然后调用 GetLocaleInfo (lcid, LOCALE_IDEFAULTANSICODEPAGE, ...) 来查找用户的默认 ANSI 代码页并使用它。在 Unix 平台上,它解析 setlocale(LC_CTYPE, NULL) 的返回值。
        【解决方案6】:

        您可以使用它来打印出 JVM 默认值

        import java.nio.charset.Charset;
        import java.io.InputStreamReader;
        import java.io.FileInputStream;
        
        public class PrintCharSets {
                public static void main(String[] args) throws Exception {
                        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
                        System.out.println("Charset.defaultCharset=" + Charset.defaultCharset());
                        System.out.println("InputStreamReader.getEncoding=" + new InputStreamReader(new FileInputStream("./PrintCharSets.java")).getEncoding());
                }
        }
        

        编译并运行

        javac PrintCharSets.java && java PrintCharSets
        

        【讨论】:

          【解决方案7】:

          它将取决于语言环境。不同的语言环境,不同的默认编码。

          【讨论】:

          • 所以这取决于主机操作系统的编码?
          猜你喜欢
          • 1970-01-01
          • 2013-03-03
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多