将unicode打印到控制台

無色受*_*想行識 5 java unicode encoding

我正在尝试创建一个可以将本地化消息打印到控制台的自定义打印流。我在Windows上执行此操作时遇到问题。这是我正在尝试做的

  • 我有一个unicode字符串
  • 使用UTF-8编码将unicode字符串转换为字节
  • 使用控制台编码将字节转换为新字符串
  • 使用控制台编码将新字符串打印到控制台

在这段代码中,我尝试执行上述步骤,但是失败了。奇怪的是,默认的System.out.println调用可以正常工作。但是,我要使用自定义打印流,而不要依赖默认的System.out。

有人可以解释我如何使用自定义打印流将unicode打印到控制台吗?为什么默认的System.out已经可以正确打印东西?

这是我的代码-我编译了它并从命令行运行了它。我预先将系统语言环境设置为zh-CN。

public static void main(String[] args) throws Exception{
    Charset defaultCharset = Charset.defaultCharset();
    System.out.println(defaultCharset);
    // charset is windows-1252

    String unicodeMessage =
            "\u4e16\u754c\u4f60\u597d\uff01";

    System.out.println(unicodeMessage);
    // string is printed correctly using System.out (?????)


    byte[] sourceBytes = unicodeMessage.getBytes("UTF-8");
    String data = new String(sourceBytes , defaultCharset.name());

    PrintStream out = new PrintStream(System.out, true, defaultCharset.name());
    out.println(data);
    // prints gibberish: ??–????????????
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*hta 6

windows-1252 字符集是这里的问题。我们需要使用 UTF-8 字符集来打印。以下为我工作:

public static void main(String[] args) throws Exception{
    Charset utf8Charset = Charset.forName("UTF-8");
    Charset defaultCharset = Charset.defaultCharset();
    System.out.println(defaultCharset);
    // charset is windows-1252

    String unicodeMessage = "\u4e16\u754c\u4f60\u597d\uff01";

    System.out.println(unicodeMessage);
    // string is printed correctly using System.out (?????)


    byte[] sourceBytes = unicodeMessage.getBytes("UTF-8");
    String data = new String(sourceBytes , defaultCharset.name());

    PrintStream out = new PrintStream(System.out, true, utf8Charset.name());
    out.println(data);
}
Run Code Online (Sandbox Code Playgroud)