Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Java控制台编码和PowerShell_Java_C#_Windows_Powershell_Unicode - Fatal编程技术网

C#和Java控制台编码和PowerShell

C#和Java控制台编码和PowerShell,java,c#,windows,powershell,unicode,Java,C#,Windows,Powershell,Unicode,以下内容均在标准控制台下的PowerShell 3.0以及PowerShell ISE中运行,并使用包含测试的unicode代码点的字体 下面的C#程序正确地打印~(因此我们知道它可以工作): 在旁注中,当我查看Console.outpunecoding时,它声称是代码页IBM850,这肯定不是真的。更奇怪的是,无论我将控制台的代码页设置为什么(使用chcp),输出都很好,因此.NET不得不担心编码本身(或者调用一些特殊的api?) 现在,当我尝试下面的Java程序时,我的输出结果是乱码(“H)

以下内容均在标准控制台下的PowerShell 3.0以及PowerShell ISE中运行,并使用包含测试的unicode代码点的字体

下面的C#程序正确地打印
~
(因此我们知道它可以工作):

在旁注中,当我查看Console.outpunecoding时,它声称是代码页IBM850,这肯定不是真的。更奇怪的是,无论我将控制台的代码页设置为什么(使用
chcp
),输出都很好,因此.NET不得不担心编码本身(或者调用一些特殊的api?)

现在,当我尝试下面的Java程序时,我的输出结果是乱码(
“H
):

这是因为Java查看系统编码并使用它,即windows-1252,所以这是意料之中的,但以下内容也不起作用:

public static void main(String[] args) throws UnsupportedEncodingException {
    new PrintStream(System.out, true, "UTF-16").println("\u2248");
}
我能做的是使用UTF-8并事先调用
chcp 65001
。这可以工作,然后显示正确的标志符号,但是有一个错误,其中一些字符在行尾重复:打印
\u2248怪异。
导致
≈奇怪。d.
所以这也不太好

那么C#使用什么编码写入控制台,或者更一般地说,如何让Java在PowerShell中正确输出Unicode

C#用于写入控制台的编码是什么

无,.NET正在使用Win32 API
WriteConsoleW
直接写入字符(嗯,UTF-16代码单元)。没有从字节步进行编码/解码,因此控制台的代码页是不相关的。(是的,850是西欧的预期代码页。)

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

我能做的是使用UTF-8并事先调用chcp 65001。这可以工作,然后显示正确的标志符号,但有一个错误,其中一些字符重复

这是针对代码页65001的Windows命令行支持中一组长期存在的错误的一部分。因此,代码页65001通常不是让C-stdlib应用程序在控制台上支持Unicode的可行方法


一般来说,没有纯跨平台的方式来编写支持Unicode的命令行应用程序。您必须检测到您连接到了面向字符的控制台(而不是面向字节的管道)在Windows上运行,在这种情况下,使用JNA调用Win32
WriteConsoleW

设置chcp 65001运行
java-Dfile.encoding=UTF-8
并使用
System.out.println()之后,您是否尝试过
而不是在
PrintStream
上创建
PrintStream
?@realponsign这是我的实际计划,旨在让现有jar文件在不更改代码的情况下正常工作(因此我希望这只是我需要的编码,而不是一些奇怪的Win32 API调用)。它的行为与使用PrintStream的方式完全相同。对此的注释可能会帮助您理解错误发生的原因。很抱歉,我没有解决方案。可能会尝试对utf-16使用1200或1201。@Real怀疑论者也尝试过,但
chcp
不支持这两个代码页-是的,我也觉得不可思议(无效的代码页,真的吗?)。是的,我认为这是一个类似的错误。见鬼,因为它几乎是从未定义的内存读取,我甚至可以崩溃控制台,真的很烦人,但到目前为止,这似乎是我最好的选择。
public static void main(String[] args) throws UnsupportedEncodingException {
    System.out.println("\u2248");
}
public static void main(String[] args) throws UnsupportedEncodingException {
    new PrintStream(System.out, true, "UTF-16").println("\u2248");
}