C#和Java控制台编码和PowerShell

时间:2015-07-11 12:20:18

标签: java c# windows powershell unicode

以下内容全部在标准控制台下的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?

1 个答案:

答案 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 WriteConsoleWExample使用JNA。