在 javac 中指定编码会产生与在 Windows CMD 中更改活动代码页然后直接编译相同的结果吗?
Does specifying the encoding in javac yield the same results as changing the active code page in Windows CMD and then compiling directly?
我正在尝试使用 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 encoding option sets how javac
will map the bytes in your source file to Unicode characters, since Java uses Unicode internally. The chcp
command 设置 Windows 控制台如何将输出字节映射到字体中的字形。 Java 不知道也不关心 chcp
,反之亦然。如果两者匹配,则一切都很好。如果不是...
在您的第一个示例中,Java 正确解释了您的 Windows-1250 来源。字符 ë
在 Unicode 中是 U+00EB
. When that byte (0xEB
) is output to a code-page 437 terminal, the displayed result is what byte 0xEB
means in cp437, regardless of what you thought you wanted to display. Per the CP437 character table, that is lowercase delta, δ
. (Just to highlight the difference, δ
is U+03B4
。)
为了完整起见,find out what the default encoding for javac
is. The docs for Charset
这么说并不容易:
The default charset is determined during virtual-machine startup and typically depends upon the locale and charset being used by the underlying operating system.
根据您看到的行为,我猜测您系统上的 javac
正在从控制台读取代码页并将其用作默认值。要么,要么默认是一个代码页,其中 ë
= 0xEB
(例如,CP1252 or ISO 8859-1,根据您的配置(据我所知),其中任何一个都可能是默认值).
编辑 在我的机器上,默认是 CP1252(Java 字符集名称 windows-1252
)。我已将 the code I used 放在 GitHub.
上
我正在尝试使用 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 encoding option sets how javac
will map the bytes in your source file to Unicode characters, since Java uses Unicode internally. The chcp
command 设置 Windows 控制台如何将输出字节映射到字体中的字形。 Java 不知道也不关心 chcp
,反之亦然。如果两者匹配,则一切都很好。如果不是...
在您的第一个示例中,Java 正确解释了您的 Windows-1250 来源。字符 ë
在 Unicode 中是 U+00EB
. When that byte (0xEB
) is output to a code-page 437 terminal, the displayed result is what byte 0xEB
means in cp437, regardless of what you thought you wanted to display. Per the CP437 character table, that is lowercase delta, δ
. (Just to highlight the difference, δ
is U+03B4
。)
为了完整起见,find out what the default encoding for javac
is. The docs for Charset
这么说并不容易:
The default charset is determined during virtual-machine startup and typically depends upon the locale and charset being used by the underlying operating system.
根据您看到的行为,我猜测您系统上的 javac
正在从控制台读取代码页并将其用作默认值。要么,要么默认是一个代码页,其中 ë
= 0xEB
(例如,CP1252 or ISO 8859-1,根据您的配置(据我所知),其中任何一个都可能是默认值).
编辑 在我的机器上,默认是 CP1252(Java 字符集名称 windows-1252
)。我已将 the code I used 放在 GitHub.