sun.jnu.encoding究竟是什么?

37 java encoding

系统属性的目的是什么sun.jnu.encoding?Web上的各种片段设置或报告它,但我找不到定义.

小智 29

见http://happygiraffe.net/blog/2009/09/24/java-platform-encoding/

此链接描述了sun.jnu.encoding在解析通过命令行传递的值时使用正确编码的属性的用法,设置file.encoding属性不会影响.


sid*_*grl 13

我根据我的分析对编码进行了一些调查

  1. sun.jnu.encoding影响文件名的创建(这可能在启动java之前由unix上的LANG设置)
  2. file.encoding会影响文件的内容

  • sun.jnu.encoding 在 OpenJDK 8 源代码中的多个地方被引用。它似乎与路径名的编码有关。从我的实验来看,用 `-D` 设置它是无效的;我实际上必须为整个系统和流程配置正确的语言环境,如 /sf/answers/2698744961/ 中所示。 (2认同)

Max*_*aer 9

我试图集中此处和网络上其他地方的答案中提供的所有信息,以便提供最完整的答案。

\n

正如其他评论所指出的,实际上有两个属性会影响 JVM 上所选的编码:

\n
    \n
  • sun.jnu.encoding,也称为“平台编码”或“JNU 编码”,是一个未记录的内部属性,它保存用于与平台交互的编码名称(例如文件路径和JNI C 字符串到 Java 字符串转换\xe2\ x80\x94 也许还有命令行参数、主类和环境变量,但我无法验证这一说法)。
    \n\xe2\x80\x8b
    \n在MacOS 上,这始终是 UTF-8,在Linux上它总是相同file.encoding(除非file.encoding被覆盖,在这种情况下我不知道会发生什么),在Windows上它可以各不相同。

    \n
  • \n
  • file.encoding也称为“默认字符集”或“用户编码”,主要用于确定编码/解码文件内容的字符集。这是返回的字符集java.nio.charsets.Charset.defaultCharset()。file.encoding请注意,许多 JDK API 使用in 中的值作为默认编码,但可以通过Charset在调用 JDK 方法时提供显式名称或字符集名称来覆盖该值。

    \n
  • \n
\n

这些属性是在 JVM 启动时动态确定的(尽管 GraalVM Native Image 的情况并非如此,它在撰写本文时在构建时设置它们)。

\n

最后,正如这份 JEP 草案所述:

\n
\n

可以在命令行上覆盖这些系统属性的值,尽管从未支持这样做。

\n
\n

  • `JNU_` 是 JVM 本机代码中内部使用的函数或宏的前缀。根据我找到的唯一(旧)文档,“JNU”代表“JNI 实用程序”。 (5认同)

McD*_*ell 2

我相信这个值代表系统编码,在某些平台上可能与用户编码(“file.encoding”)不同。“sun”前缀让我怀疑这是特定于 Sun JRE 的实现细节(快速查看 IBM 1.4 VM 会显示“ibm.system.encoding”系统属性)。我不知道如何在内部使用它 - 尽管我确信快速浏览源代码会产生一些线索。