我正在尝试创建一个可以将本地化消息打印到控制台的自定义打印流。我在Windows上遇到了这个问题。这是我正在尝试做的事情
在此代码中,我尝试执行上述步骤,但它失败了。奇怪的是,默认的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: ??–????????????
}
答案 0 :(得分:3)
windows-1252 charset就是这里的问题。我们需要使用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);
}
答案 1 :(得分:0)
您有许多问题和误解。首先,
byte[] sourceBytes = unicodeMessage.getBytes("UTF-8");
String data = new String(sourceBytes , defaultCharset.name());
data
现在充满了mojibake - 你已经将UTF-8解码为windows-1252。然后通过UTF-8编码器打印此字符串。 System.out然后编码您的控制台的代码页。它有三个级别的破碎。
现在,System.out.println(unicodeMessage);
的工作原因是因为您正确设置了区域设置。 Java使用它(控制台的代码页),而不是defaultCharset来设置控制台。
问题是,你将面临的是Window控制台不支持UTF-8。您可以在代码页中打印字符,但不能打印其他字符。找到另一种解决方案,例如写入文件或将结果发送到网页。