【发布时间】: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