【问题标题】:Why is this Java program gives incorrect results on Eclipse and correct results when run from terminal?为什么这个 Java 程序在 Eclipse 上给出不正确的结果,从终端运行时给出正确的结果?
【发布时间】:2013-06-15 00:09:50
【问题描述】:

考虑以下程序。

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 的文件编码选项更改为 UTF-8 时,它会在 Eclipse 中打印正确的结果。

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

知道为什么会这样吗?

我正在使用 Java 1.6 (Sun JDK)、Mac OSx 10.7。

【问题讨论】:

  • "默认编码是 MacRoman"
  • 在您的最后一行中,您能否将特定的Charset 附加到String 构造函数(例如,Charset.forName("UTF-8")?那么结果是什么?

标签: java eclipse encoding character-encoding


【解决方案1】:

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

  • 点击“运行”
  • 点击“运行配置”,然后点击“常用”选项卡
  • 将编码更改为 UTF

【讨论】:

    【解决方案2】:
    System.out.println("\u0905\u0905\u0905");
    

    将是直截了当的用法。

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

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

    【讨论】:

    • 当您说System.out.println("\u0905\u0905\u0905"); 时,我认为它会转换为默认编码。不能保证它将是 UTF-8 编码的。这就是我使用CharSet 强制编码的原因。还是我错过了什么?
    • 有趣的是,将UTF-8 添加到new String(encoded.array()) 时,它只从终端打印???。这很奇怪!
    • @Appu 编码是字节和字符之间的映射。 \u905 已经是一个(unicode)字符,因此您无需指定编码即可从中创建字符串。如果要将其转换为 byte[]...,则需要指定编码
    • 是的,@assylias 是对的:byte[] 是二进制数据,String 是文本——当然 Java 在内部选择了 Unicode(对于所有文本)。 char 是 16 位 Unicode (UTF-16),字符串常量以 UTF-8 更紧凑地存储。 ecdlipse IDE 控制台、Windows 应用程序和 DOS 命令行可以使用不同的编码。在内部,他们混合使用 C char[],它实际上是 byte[] + 平台编码。 Java 为不可转换的 Unicode 提供了 ?
    【解决方案3】:

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

    【讨论】:

    • 除了“你的”这里的拼写错误之外,您能否提供一个链接来说明“Eclipse 使用默认的 ANSI 编码”的声明?而在 2013 年,谁仍然使用 ASCII 作为默认值?
    【解决方案4】:

    确保用于显示输出的控制台也以 UTF-8 编码。例如,在 Eclipse 中,您需要转到 Run Configuration > Common 来执行此操作。

    【讨论】:

    • 他提到 当我将 Eclipse 的文件编码选项更改为 UTF-8 时,它会在 Eclipse 中打印正确的结果。
    • 这修复了它。看起来控制台编码是从文件的编码继承而来的。当文件编码更改时,控制台编码也更改为 UTF-8
    【解决方案5】:

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

    new String(encoded.array(), charset)
    

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

    【讨论】:

    • 嗯,我把它作为评论:p +1
    • 注意:(好吧,您可能已经知道...)JDK 7 中的 UTF-8 是 StandardCharsets.UTF_8。对于较小的版本,这必须是 `Charset.forName("UTF-8")...
    • 我已经尝试在创建字符串时添加字符集。在这种情况下,从 Eclipse 中,它可以工作。从终端,它只打印“???”。这适用于命令行java -Dfile.encoding=UTF-8 HelloWorld
    • @Appu 可能是因为您的终端字体不支持该特定字符。您的原始代码正在运行,但没有打印正确的字符。
    猜你喜欢
    • 2011-02-04
    相关资源
    最近更新 更多