为什么 system.out.println() 在法语操作系统上返回不同的法语字符
嗨,这是一个简单的问题,但我自己也不知道答案...... 在法国操作系统上运行以下代码的输出是
public class FrenchTest {
public static void main(String[] args){
String[] lines = {"Le résultat est", "Nom de l'hôte"};
for(String line : lines){
System.out.println("NOW : " + line);
}
}
//////////////
c:\share>java FrenchTest
NOW : Le résultat est
NOW : Nom de l'hôte
c:\share>CHCP 65001
c:\share>java FrenchTest
NOW : Le résultat est
NOW : Nom de l'hôte
How come?这种情况的编码要点在哪里,它在英文版操作系统上运行良好,谢谢!
Hi this is a simple question, don't know the answer myself though...
The output of following code running on a French OS is
public class FrenchTest {
public static void main(String[] args){
String[] lines = {"Le résultat est", "Nom de l'hôte"};
for(String line : lines){
System.out.println("NOW : " + line);
}
}
//////////////
c:\share>java FrenchTest
NOW : Le résultat est
NOW : Nom de l'hôte
c:\share>CHCP 65001
c:\share>java FrenchTest
NOW : Le résultat est
NOW : Nom de l'hôte
How come? Where is the encoding gist for this case, it works fine on English version OS, THANKS!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您更改代码页,然后告诉 java 以 UTF-8 输出,它应该可以工作。请注意,您需要选择 unicode (truetype) 字体 - 我的机器上安装了 Consolas 和 Lucida Console。
请注意,如下所示,我使用 java 1.6.0_23 在我的机器上重复了最后一个字符。无法真正解释这一点:(
If you change the code page and then tell java to output in UTF-8, it should work. Note that you will need to choose a unicode (truetype) font - I have Consolas and Lucida Console installed on my machine.
Note as below, I get the last character repeated on my machine using java 1.6.0_23. Can't really explain this :(
这里有两个潜在的问题:
您可以使用 Unicode 转义来回避编译问题:
"Nom de l'h\u00F4te "
默认情况下,Windows 上的数字 2 总是错误的。为了与旧的 DOS 程序兼容,cmd.exe 默认使用 OEM 系统编码。这不是仍然停留在 Unicode 之前的编码的 Windows 系统部分所使用的默认“ANSI”编码。
您可以通过 切换控制台来解决此问题编码到windows-1252:
...或者通过更改用于将数据发送到控制台编码的编码。最简单的方法是使用 控制台。与
System.out
不同,System.console()
检测并使用控制台编码。使用Console
可能会导致在 IDE 中运行代码时出现问题,但有 你可以做的事情。我无法获取UTF-8与 65001 一起工作。
简而言之,您需要克服为保持向后兼容性而做出的决定。
There are two potential problems here:
System.out
encodes it inYou can sidestep compilation issues by using Unicode escapes:
"Le r\u00E9sultat est"
"Nom de l'h\u00F4te"
By default, number 2 is always wrong on Windows. For compatibility with old DOS programs, cmd.exe uses OEM system encodings by default. This is not the default "ANSI" encoding used by the parts of the Windows system still stuck in pre-Unicode encodings.
You can fix this either by switching the console encoding to windows-1252:
...or by changing the encoding used to emit data to the console encoding. The easiest way to do this is to use Console. Unlike
System.out
,System.console()
detects and uses the console encoding. UsingConsole
can cause issues with running code in IDEs, but there are things you can do about that.I have been unable to get UTF-8 to work with 65001.
In short, you need to overcome decisions made to preserve backwards compatibility.
您必须更改控制台上的编码。在 Windows 中,可以使用 CHCP(更改控制页面)
命令
65001
将控制台上的控制页面更改为 UTF-8。You will have to change encoding on your console. In Windows, it's by using the CHCP (CHange Control Page) command
E.g.
65001
changes the control page on your console to be UTF-8.它适用于我的机器:
Java 使用操作系统设置作为默认设置,但您应该更改这两个设置。
It works on my machine:
Java uses the OS settings as defaults, but you should change these two.