我正在尝试创建一个自定义打印流,可以将本地化消息打印到控制台。我在 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: ??–????????????
}
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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)