sun.jnu.encoding 到底是什么?

问题描述 投票:0回答:5

系统属性

sun.jnu.encoding
的用途是什么?网络上的各种片段设置或报告它,但我找不到定义。

java encoding
5个回答
32
投票

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

此链接描述了

sun.jnu.encoding
属性的用法,以便在解析通过命令行传递的值时使用正确的编码,设置
file.encoding
属性不会产生影响。


16
投票

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

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

9
投票

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

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

  • sun.jnu.encoding
    ,也称为“平台编码”或“JNU 编码”,是一个未记录的、内部属性,它保存用于与平台交互的编码名称(例如,文件路径) JNI C String 到 Java String 转换 — 也许还有 命令行参数、主类和环境变量,但我无法验证这一说法)。

    MacOS 上,这始终是 UTF-8,在 Linux 上,它始终与
    file.encoding
    相同(除非
    file.encoding
    被覆盖,在这种情况下我不知道会发生什么),在 Windows 上,它可以各有不同。

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

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

最后,正如JEP 草案所述:

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


2
投票

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


0
投票
hi body ,you can do that,

first, 
#sudo systemctl edit jenkins.service

Environment="JAVA_OPTS=-Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8”
Environment="JAVA_TOOL_OPTIONS=-Dfile.encoding=utf8 -Dsun.jnu.encoding=UTF-8"

second,
#systemctl daemon-reload
# systemctl stop jenkins
# systemctl start jenkins
© www.soinside.com 2019 - 2024. All rights reserved.