我正在尝试使用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
答案 0 :(得分:2)
欢迎光临本站! javac encoding option设置javac
将chcp
将源文件中的字节映射为Unicode字符的方式,Java uses Unicode internally。 chcp
command设置Windows控制台如何将字节输出映射到字体中的字形。 Java不知道或不关心ë
,反之亦然。如果两者都匹配,一切都很好。如果不是......
在第一个示例中,Java正确解释了Windows-1250源代码。字符0xEB
为U+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 Charset
或CP1252的代码页,其中任何一个都可能是默认值,具体取决于您的配置(据我所知))。
编辑在我的计算机上,默认为CP1252(Java字符集名称click.trigger
)。我已将ISO 8859-1放在GitHub上。