以下内容全部在标准控制台下的PowerShell 3.0以及Powershell ISE中运行,并使用包含测试的unicode代码点的字体。
以下C#程序正确打印~
(因此我们知道可以工作):
static void Main(string[] args)
{
Console.WriteLine("\u2248");
}
在我看到Console.OutputEncoding
的旁注时,它声称是IBM850的代码页,这当然不可能。甚至更奇怪的是,我独立于我设置控制台的代码页(使用chcp
)输出是正常的,因此.NET必须担心编码本身(或调用一些特殊的API?)
现在,当我尝试以下Java程序时,我最终出现乱码输出( "H
):
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println("\u2248");
}
现在,这是因为Java查看系统编码并使用它,这将是windows-1252,所以这是预期的,但以下也不起作用:
public static void main(String[] args) throws UnsupportedEncodingException {
new PrintStream(System.out, true, "UTF-16").println("\u2248");
}
我可以做的是使用UTF-8并事先调用chcp 65001
。这样可以显示正确的字形,但有一个错误,其中一些字符在行尾重复:打印\u2248weird.
会导致≈weird.d.
因此这不是很好任
那么C#使用什么编码来写入控制台,或者更一般地说如何让Java在PowerShell中正确输出Unicode? p>
答案 0 :(得分:2)
C#使用什么编码来写入控制台
无,.NET正在使用Win32 API WriteConsoleW
直接编写字符(以及UTF-16代码单元)。没有编码/解码字节步骤,因此控制台的代码页无关紧要。 (是的,850是西欧的预期代码页。)
其他应用程序和语言(包括Java)正在使用以字节为单位的C标准库IO函数,因此涉及到编码 - 解码阶段,这确实使用了控制台代码页。
我能做的是使用UTF-8并事先调用chcp 65001。这有效,然后显示正确的字形,但有一个错误,其中一些字符重复
这是代码页65001的Windows命令行支持中一组长期存在的错误的一部分。通常,代码页65001不是让C-stdlib应用程序在控制台上支持Unicode的可行方法。< / p>
通常,没有纯粹的跨平台方式来编写支持Unicode的命令行应用程序。您必须检测到您已连接到面向字符的控制台(而不是面向字节的管道)并在Windows上运行,并且在该情况下分支以调用Win32 WriteConsoleW
。 Example使用JNA。