为什么system.out.println()在法语操作系统上返回不同的法语字符

时间:2011-08-22 07:22:46

标签: java encoding

嗨,这是一个简单的问题,虽然不知道自己的答案...... 在法语操作系统上运行的以下代码的输出是

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

为什么?对于这种情况,编码要点在哪里,它在英文版操作系统上工作正常,谢谢!

4 个答案:

答案 0 :(得分:1)

如果您更改代码页然后告诉java以UTF-8输出,它应该可以工作。请注意,您需要选择unicode(truetype)字体 - 我的机器上安装了Consolas和Lucida Console。

请注意以下内容,我使用java 1.6.0_23在我的机器上重复了最后一个字符。无法解释这一点:(

msandiford@foo /cygdrive/c/foo
$ javac FrenchTest.java

msandiford@foo /cygdrive/c/foo
$ java -Dfile.encoding=UTF-8 FrenchTest
NOW : Le résultat estt
NOW : Nom de l'hôtee

msandiford@foo /cygdrive/c/foo
$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)

答案 1 :(得分:1)

这里有两个潜在的问题:

  1. 编译时间转码问题 - 读取源文件的encoding your compiler uses必须与编辑器用来保存源文件的文件相匹配
  2. 运行时转码问题 - 控制台用于读取数据的编码必须与{/ 1}}编码的编码相匹配
  3. 您可以使用Unicode转义来回避编译问题:

    • System.out
    • "Le r\u00E9sultat est"

    默认情况下,Windows上的数字2始终是错误的。为了与旧的DOS程序兼容,cmd.exe默认使用OEM系统编码。这不是Windows系统中仍然停留在Unicode前编码中的部分所使用的默认“ANSI”编码。

    您可以通过switching the console encoding将其修复为windows-1252:

    "Nom de l'h\u00F4te"

    ...或通过将用于发出数据的编码更改为控制台编码。最简单的方法是使用Console。与>chcp 1252 不同,System.out检测并使用控制台编码。使用System.console()会导致在IDE中运行代码时出现问题,但有things you can do about that

    我已经unable to get UTF-8 to work获得了65001。

    简而言之,您需要克服为保持向后兼容性而做出的决定。

答案 2 :(得分:0)

它适用于我的机器:

  • 将文件编码设置为UTF-8
  • 将控制台编码设置为UTF-8

Java使用操作系统设置作为默认值,但您应该更改这两个。

答案 3 :(得分:0)

您必须在控制台上更改编码。在Windows中,使用CHCP(CHange控制页面)命令

E.g。

CHCP 65001  

65001将控制台上的控制页面更改为UTF-8。