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

时间:2016-08-10 14:36:38

标签: java encoding cmd javac

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

欢迎光临本站! javac encoding option设置javacchcp将源文件中的字节映射为Unicode字符的方式,Java uses Unicode internallychcp command设置Windows控制台如何将字节输出映射到字体中的字形。 Java不知道或不关心ë,反之亦然。如果两者都匹配,一切都很好。如果不是......

在第一个示例中,Java正确解释了Windows-1250源代码。字符0xEBU+00EB。当该字节(0xEB)输出到代码页437终端时,显示的结果是 cp437 中的δ字节,无论您认为自己想要什么显示。根据{{​​3}},即小写增量δ。 (为了突出显示差异,javac在Unicode中为CP437 character table。)

为了完整起见,事实证明U+03B4不太容易。 find out what the default encoding for javac is说:

  

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

根据您看到的行为,我猜您的系统上的ë正在从控制台读取代码页并将其作为默认值。要么是这样,要么默认是0xEB = windows-1252(例如docs for CharsetCP1252的代码页,其中任何一个都可能是默认值,具体取决于您的配置(据我所知))。

编辑在我的计算机上,默认为CP1252(Java字符集名称click.trigger)。我已将ISO 8859-1放在GitHub上。