【问题标题】:C# and Java Console Encoding and PowerShellC# 和 Java 控制台编码和 PowerShell
【发布时间】:2015-09-30 04:02:30
【问题描述】:

以下内容均在标准控制台下的 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.,所以这也不是很好。 p>

那么 C# 使用什么编码来写入控制台,或者更一般地说,我怎样才能让 Java 在 PowerShell 中正确输出 Unicode?​​p>

【问题讨论】:

  • 在设置chcp 65001 运行java -Dfile.encoding=UTF-8 并使用System.out.println() 而不是在PrintStream 上创建PrintStream 之后,您是否尝试过?
  • @RealSkeptic 这是我关于如何使现有 jar 文件正常工作而无需更改代码的实际计划(所以我希望它只是我需要的编码,而不是一些奇怪的 Win32 API 调用)。不过,它的行为方式与使用 PrintStream 完全相同。
  • answer 的 cmets 可以帮助您了解错误发生的原因。抱歉,我没有解决方案。对于 utf-16 可能会尝试 1200 或 1201。
  • @RealSkeptic 也试过了,但是chcp 不支持这两个代码页 - 是的,我也觉得非常奇怪(无效的代码页,真的吗?)。是的,我认为它与错误有关。哎呀,因为它几乎是从未定义的内存中读取的,我什至可以让控制台崩溃,确实很烦人,但到目前为止这似乎是我最好的选择。

标签: java c# windows powershell unicode


【解决方案1】:

C# 使用什么编码来写入控制台

无,.NET 使用 Win32 API WriteConsoleW 直接写入字符(嗯,UTF-16 代码单元)。没有 encode/decode-from-bytes 步骤,因此控制台的代码页是无关紧要的。 (是的,850 是西欧的预期代码页。)

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2014-02-27
    • 2018-12-30
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多