C#和Java控制台编码和PowerShell

问题描述:

以下内容均在标准控制台以及Powershell ISE下使用包含经过测试的unicode代码点的字体在PowerShell 3.0中运行。C#和Java控制台编码和PowerShell

下面的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呢?

+0

您是否在设置运行'java -Dfile.encoding = UTF-8'的'chcp 65001'并使用'System.out。println()'而不是通过'PrintStream'创建一个'PrintStream'? – RealSkeptic

+0

@RealSkeptic这是我如何使现有的jar文件正常工作而不必更改代码(所以我希望它只是我需要的编码而不是一些奇怪的Win32 API调用)的实际计划。它的行为与使用PrintStream的方式完全相同。 – Voo

+0

对这[[答案](http://stackoverflow.com/a/388500/4125191)的评论可能会帮助你理解错误发生的原因。抱歉,我没有解决方案,但。可能尝试使用utf-16的1200或1201。 – RealSkeptic

什么编码是利用写入到控制台

无,.NET被使用Win32 API WriteConsoleW至(井,UTF-16代码单元)直接写字符C#。没有编码/从字节解码的步骤,所以控制台的代码页是不相关的。 (是的,850是西欧预期的代码页。)

其他应用程序和语言(包括Java)正在使用C标准库IO函数,这些函数以字节为单位进行处理,因此涉及编码解码阶段,控制台代码页。

我能做的就是事先使用UTF-8并调用chcp 65001。这工作,然后会显示正确的字形,但其中一些字符重复

这是Windows的命令行支持代码页65001通常代码页65001是一套长期的错误的部分错误由于这个原因,没有一种可行的方式让C-stdlib应用程序在控制台上支持Unicode。

通常没有纯粹的跨平台方式来编写支持Unicode的命令行应用程序。您必须检测到您已连接到面向角色的控制台(而不是面向字节的管道)并在Windows上运行,并且在此情况下,需要调用Win32 WriteConsoleW。使用JNA的Example