如何在Windows控制台中输入特殊字符(0x80..0x9F)?

5

I would like to have this code:

System.Console.Out.WriteLine ("œil");

在我的测试程序中,我希望显示 œil 而非 oil

在我的系统上,Console.OutputEncoding 默认设置为 西欧(DOS)CodePage 设置为 850,WindowsCodePage 设置为 1252)。该字符集包含特殊的 OE 和 oe 双元音字母(可在Windows-1252 的维基百科文章中查看),但某些未包含在 ISO-8859-1 字符集中的字符被丢弃或替换。

控制台上可以正确地显示诸如 âç 等字符,但扩展的 0x80...0x9F 范围内的任何字符都无法正常显示。

如何在控制台上正确显示它们?


2
在控制台上获得代码页1252非常不寻常,几乎总是437,即IBM PC OEM代码页。该代码页没有\u0153的字形。您可以更改OutputEncoding,但那么您还必须更改控制台字体。 - Hans Passant
顺便说一下,“西欧(DOS)”是代码页850,而不是1252。它包含了ISO 8859-1中的所有字符(即Windows 1252的0xA0-0xFF),这可能导致了一些混淆。.NET函数本身使用Unicode,但在选择非TrueType字体时,将其写入控制台时会被翻译(有时翻译质量较差)。 - Random832
我已经澄清了代码页问题;System.Text.SBCSCodePageEncoding 返回了一个代码页和一个 Windows 代码页,我混淆了两者。抱歉。 - Pierre Arnaud
2个回答

6

像这样:

Console.OutputEncoding = System.Text.Encoding.UTF8;
System.Console.Out.WriteLine("œil");

不要忘记选择一个支持所需字符的控制台窗口字体。这是我使用Consolas字体的控制台窗口截图。 enter image description here

实际上,这并不起作用。在我的 Windows 7 x64 上执行您的代码会产生一个十字后跟字符 ôil - Pierre Arnaud
2
在我这边可以正常工作。你的控制台窗口用的是什么字体? - David Heffernan
警告:Lucida Console 字符出错很多。使用其他字体,例如 Consolas。 - ggPeti
请参考https://dev59.com/8HI-5IYBdhLWcg3wio5k,了解如何使用Interop在C#中更改控制台的字体。 - Pierre-Alain Vigeant
秘密确实在于字体... 使用Consolas作为字体可以使UTF8输出正确显示,就像David在他的屏幕截图中发布的那样。非常感谢。 - Pierre Arnaud
顺便提一下,这里有一个相关的问题:http://stackoverflow.com/questions/7939643/how-do-i-read-special-characters-0x80-0x9f-from-the-console-in-c(如何读取特殊字符) - Pierre Arnaud

2
您可以像这样在控制台上设置输出编码...
Console.OutputEncoding = Encoding.UTF8;

我猜我最后在一张过期的页面上发表了评论 :) - Prashanth
是的,我自己也经常这样做 +1 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接