为什么这个Java程序在Eclipse上提供了错误的结果并且从终端运行时得到了正确的结果?

时间:2013-06-18 16:54:22

标签: java eclipse encoding character-encoding

考虑以下计划。

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

public class HelloWorld {

    public static void main(String[] args)  {       
        System.out.println(Charset.defaultCharset());
        char[] array = new char[3];
        array[0] = '\u0905';
        array[1] = '\u0905';
        array[2] = '\u0905';
        CharBuffer charBuffer = CharBuffer.wrap(array);
        Charset utf8 = Charset.forName("UTF-8");
        ByteBuffer encoded = utf8.encode(charBuffer);
        System.out.println(new String(encoded.array()));

    }
}

当我使用终端执行此操作时,

java HelloWorld

我得到了正确编码的形状文本。默认编码为MacRoman

现在当我从Eclipse执行相同的代码时,我看到不正确的文本被打印到控制台。

Eclipse console showing scrambled text

当我将Eclipse的文件编码选项更改为UTF-8时,它会在Eclipse中打印正确的结果。

我想知道为什么会这样?理想情况下,文件编码选项不应该影响此代码,因为这里我明确使用UTF-8。

知道为什么会这样吗?

我使用的是Java 1.6(Sun JDK),Mac OSx 10.7。

5 个答案:

答案 0 :(得分:3)

您需要在创建字符串时指定要使用的编码:

new String(encoded.array(), charset)

否则它将使用默认字符集。

答案 1 :(得分:2)

确保用于显示输出的控制台也以UTF-8编码。例如,在Eclipse中,您需要转到Run Configuration>通常这样做。

enter image description here

答案 2 :(得分:1)

System.out.println("\u0905\u0905\u0905");

将是直截了当的用法。

String构造函数缺少编码,默认为设置默认编码。

new String(encoded.array(), "UTF-8")

答案 3 :(得分:0)

这是因为Eclipse使用默认的ANSI编码,而不是UTF-8。如果您使用的编码与IDE使用的编码不同,则会得到不可读的结果。

答案 4 :(得分:0)

您需要更改控制台运行配置。

  • 点击“运行”
  • 点击“运行配置”,然后点击“常用”标签
  • 将编码更改为UTF enter image description here