在javac中指定编码是否与在Windows CMD中更改活动代码页然后直接编译产生相同的结果?



我正在尝试使用Windows-1250编码在Windows CMD中编译一段Java代码,并且我似乎无法获得-encoding选项正确工作。

编译器似乎不使用指定的编码,除非存在非法字符,在这种情况下,它只是显示错误消息。否则,它将使用活动代码页。

特别地,我试图显示一个包含阿尔巴尼亚字符的字符串,特别是'ë'。

我需要显示的字符串如下:

Hëllë Wërld

下面是我使用的命令和它们产生的输出:

chcp
Output: Active code page: 437
javac -encoding Windows-1250 AlbanianHello.java
java AlbanianHello
Output: Hδllδ Wδrld
如您所见,它仍然使用默认编码,即Cp437,尽管我指定了希望使用的编码。

现在,当我将代码页更改为1250,然后在不指定编码的情况下进行编译时,会发生以下情况:

chcp 1250
Output: Active code page: 1250
javac AlbanianHello.java
java AlbanianHello
Output: Hëllë Wërld

似乎工作正常。

在本例中指定编码会产生相同的结果:

chcp 1250
Output: Active code page: 1250
javac -encoding Windows-1250 AlbanianHello.java
java AlbanianHello
Output: Hëllë Wërld

那么它完全忽略我指定的编码吗?不完全是。当我尝试使用不应该与字符串一起工作的编码时,它会显示一堆错误消息:

javac -encoding UTF8 AlbanianHello.java
Output: AlbanianHello.java:5: error: unmappable character for encoding UTF8
    System.out.println("H?ll? W?rld");
                         ^
...
3 errors

我的问题是:为什么它在理论上应该工作的时候忽略编码,而在它不应该工作的时候却不忽略它?

我还想知道这些命令的结果是否有什么不同:

chcp 1250
javac AlbanianHello.java

还有这些

chcp 1250
javac -encoding Windows-1250 AlbanianHello.java

欢迎光临本站!javac编码选项设置javac如何将源文件中的字节映射为Unicode字符,因为Java在内部使用Unicode。chcp命令设置Windows控制台如何将输出字节映射为字体中的字形。Java不知道也不关心chcp,反之亦然。如果两者匹配,一切都很好。如果不是…

在你的第一个例子中,Java正确地解释了你的Windows-1250源代码。字符ëU+00EB。当字节(0xEB)输出到代码页437终端时,所显示的结果就是字节0xEBcp437中的含义,而不管您想要显示什么。根据CP437字符表,这是小写的δ, δ。(只是为了突出区别,δ在Unicode中是U+03B4。)

为了完整起见,要找出javac的默认编码是什么并不容易。Charset的文档说:

默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统使用的语言环境和字符集。

根据你看到的行为,我猜你的系统上的javac正在从控制台读取代码页,并将其作为默认值。或者是默认的代码页,其中ë = 0xEB(例如,CP1252或ISO 8859-1,这两种都可能是默认的,这取决于你的配置(据我所知)。

Edit在我的机器上,默认值是CP1252 (Java字符集名称windows-1252)。我把我在GitHub上使用的代码。

相关内容

最新更新