JVM 如何确定 Linux 上 argv 的(默认?)字符编码

2023-12-04

Java 有一个默认字符编码,它在未显式提供字符编码的上下文中使用。的文档how它选择编码是模糊的:

默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。

该文档必须含糊不清,因为 JVM 使用的方法是特定于系统的。

通常使用默认的字符编码一个坏主意;最好使用明确指定的编码,或者对于某些 I/O 始终使用相同的编码。但默认字符编码的一种不可避免的使用似乎是用于命令行参数的字符编码。在 Linux 等 POSIX 系统上,JVM 的本机 (C/C++) 代码将命令行参数获取为以 null 结尾的 C/C++ 列表char指针。应该将其视为字节指针,因为它们必须编码中的代码点某种(不清楚)方式。 JVM 必须解释这些 C/C++ 序列chars(字节)将它们转换成Java序列chars,给予main()Java 程序的。我假设 JVM 为此使用默认的字符编码。

因此,我需要准确地了解 JVM 如何确定特定系统(现代 GNU/Linux 操作系统)的默认编码,以便我可以提供有关我的程序行为方式的用户文档,以便我的程序的用户可以预测它的行为方式表现。

我猜 JVM 会检查一些环境变量,但是哪些变量呢?


当然你可以看一下源码java.nio.charset.Charset.defaultCharset()。当我在我的系统(64 位 Windows 7,带有 Oracle JDK 8 更新 25)上执行此操作时,我看到以下内容:

public static Charset defaultCharset() {
    if (defaultCharset == null) {
        synchronized (Charset.class) {
            String csn = AccessController.doPrivileged(
                new GetPropertyAction("file.encoding"));
            Charset cs = lookup(csn);
            if (cs != null)
                defaultCharset = cs;
            else
                defaultCharset = forName("UTF-8");
        }
    }
    return defaultCharset;
}

换句话说,它查看系统属性file.encoding如果找不到匹配的Charset例如,它使用UTF-8.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 如何确定 Linux 上 argv 的(默认?)字符编码 的相关文章

随机推荐

  • 在java中加载精灵图像

    我想问一下为什么在将任何精灵图像加载到对象中时出错 这是我获取图像的方法 import java awt image BufferedImage import java io IOException public class SpriteS
  • 如何正确使用 allContactedBodies?

    我想使用 allContactedBodies 而不是 didBeginContact 和 didEndContact 当我做 NSLog node physicsBody allContactedBodies 与物体发生正确的接触 我得到
  • 如何简化javascript程序?

    我很想最小化该程序 也许将 p1 16 放在一行代码中 与 count 和 gefunden 相同 由于我的语言能力很差 我找不到正确的信息 如果有一种方法可以最大限度地减少搜索命中 pdf 中的 if else 语句 那就太好了 现在 我
  • 如何使用 ImageFormatConverter.ConvertFromString 将包含 HTML 响应的字符串转换为图像?

    这就是我所取得的成就 在页面加载中 panelmain Controls Add abc panelmain Controls Add grid1 string toexport toexport RenderControl panelma
  • 验证网络凭据以访问客户端对象模型上的 SharePoint 网站

    我正在开发小型应用程序 需要将给定网站的所有组中的所有用户都吸引过来 我有两个网站 SharePoint 2010 在本地运行 SharePoint 2013 在线运行 我收到凭据错误 The remote server returned
  • 用 gfortran 编译的神秘关联行为

    我有以下简短的 Fortran 代码 MODULE PREC INTEGER PARAMETER q 8 END MODULE PREC MODULE MOD FIT USE prec q TYPE spec INTEGER HL HR C
  • 将子存储库内容推送到一起(不使用 git 子模块)

    在主存储库中 还有另一个存储库 可能是从 github 下载的 我将其称为子存储库 我不想使用 git 子模块功能 子存储库最终可能会被提交并推送到他自己的遥控器上 但我想在主存储库中继续工作 忽略该文件夹 子存储库 实际上是一个 git
  • 是否可以在 eclipse indigo 中使用 tomcat 7.0.20?

    在安装新的 eclipse indigo IDE 时 我尝试设置之前从 Apache 网站 tomcat 7 0 20 下载的 tomcat 服务器 但没有成功 当我在表单中填写 tomcat 目录时 会出现错误 提示我选择的版本无效 它还
  • SilverStripe - 限制数据对象可以拥有的多个关系的数量

    如果我有一个 has many我想与之管理的关系GridField在 cms 中 我将如何限制一个对象可以拥有的关系数量 这可能吗 我可以在模型中执行此操作吗 还是必须将其添加到GridField我正在使用添加和删除关系 我正在考虑实施Gr
  • Amazon SES - 统计发送的电子邮件统计数据

    我使用 SES 发送电子邮件 我在 Amazon SES 服务下有超过 10 个经过验证的域 但我的问题是 我没有每个电子邮件地址或域的任何统计信息 AWS 控制台将所有发送 退回等组合在一起 那么我怎样才能知道从我的某个域发出了多少封电子
  • matlab CUDA 内核中二维数组的操作

    假设我有以下序列号C int add int a int b int n for i 0 i
  • 淘汰赛日期在发布到 MVC 控制器时重置

    我有一个淘汰赛 mvc3 应用程序 我正在将日期传递回控制器 控制器 public ActionResult PackageUpdate Package updatePackage do some stuff but dates are s
  • 并排放置 2 个 svg

    我可以在 d3 js 的一个屏幕上使用 2 个 svg 代码看起来像这样并且效果很好
  • 选择后更改 TreeViewItem 的前景

    在我的程序中我有一个TreeView用户将从中选择不同的项目 我的中有一些项目TreeView它们是在我的 C 代码隐藏中创建时自定义的 Like so public static TreeViewItem newItem new Tree
  • 如何在 Angular 2 中正确设置 Http 请求标头

    我有一个使用 Angular 2 的 Ionic 2 应用程序 它将 Http PUT 发送到 ASP NET Core API 服务器 这是我用来发送请求的方法 public update student Student Promise
  • WPF从其他线程访问GUI

    我正在满足仅创建 WPF 应用程序单个实例的要求 但是 我必须将命令行传递到第一个实例 然后执行一些 UI 操作 我使用互斥体来检查已经运行的实例 我使用命名管道将命令行传输到已经运行的实例 但当然我不在正确的线程中访问 Window1 我
  • 使用输出方法 html 避免在 XSLT 中进行 URL 编码

    我有一个输出 HTML 的转换 为了避免在旧版浏览器中可能损坏的自关闭标签 例如 img 代替 img 输出方法必须是html 然后 虽然应用了 URL 编码 但它破坏了我的应用程序 参见示例 Input example a href ex
  • Fortran:类型大小未知的数组

    也许这是一个非常愚蠢的问题 人们确实应该采取不同的做法 但是 有没有可能有类似的东西 type food INTEGER NBananasLeft NBananaTypes INTEGER NApplesLeft NAppleTypes e
  • 未声明的类型 - 通过桥接标头在 Swift 中使用 C 结构体

    我已经看到与此相关的其他问题 但没有任何帮助我 我在将 ImageMagick sdk 集成到 swift 时遇到问题 ViewController swift class ViewController UIViewController v
  • JVM 如何确定 Linux 上 argv 的(默认?)字符编码

    Java 有一个默认字符编码 它在未显式提供字符编码的上下文中使用 的文档how它选择编码是模糊的 默认字符集是在虚拟机启动期间确定的 通常取决于底层操作系统的区域设置和字符集 该文档必须含糊不清 因为 JVM 使用的方法是特定于系统的 通