【问题标题】:How do I read special characters (0x80 ... 0x9F) from the Windows console in C#?如何在 C# 中从 Windows 控制台读取特殊字符 (0x80 ... 0x9F)?
【发布时间】:2011-10-29 14:54:27
【问题描述】:

David的帮助下,我终于解决了writing special characters (0x80...0x9F) to the Windows console的问题:

  1. 输出编码必须设置为 UTF-8。
  2. 控制台使用的字体应该类似于 Consolas。

现在我希望能够读回包含 0x80-0x9F 范围内的特殊字符的文本(使用 Windows 1252 编码),例如欧元符号 (€):

string text = System.Console.ReadLine ();

每当我输入一个特殊字符时返回null。我天真地尝试将InputEncoding 设置为UTF8:

System.Console.InputEncoding = System.Text.Encoding.UTF8;

但这无济于事。

【问题讨论】:

  • 不是真正的解决方案,但我确实找到了这个Microsoft Connect 错误报告。
  • 只写一个 GUI 应用程序不是更容易吗?他们很好地处理 Unicode。
  • 试试System.Console.Read()...

标签: c# character-encoding console windows-console


【解决方案1】:

您可以设置控制台应用程序的输入代码页来读取这些特殊字符。 有一个名为 SetConsoleCP 的 Win32 api 来设置输入代码页。在以下示例中,我使用 Windows-1252 代码页:

[DllImport("kernel32.dll")]
private static extern bool SetConsoleCP(uint wCodePageID);

static void Main(string[] args)
{
  SetConsoleCP((uint)1252);
  Console.OutputEncoding = Encoding.UTF8;
  System.Console.Out.WriteLine("œil"); 

  string euro = Console.In.ReadLine();

  Console.Out.WriteLine(euro);
}

编辑:

作为 L.B.建议您也可以使用 Console.InputEncoding = Encoding.GetEncoding(1252)。

这是没有互操作的完整示例(注意,您也可以使用 Windows-1252 代码页进行输出编码:

static void Main(string[] args)
{
  Console.InputEncoding  = Encoding.GetEncoding(1252);
  Console.OutputEncoding = Encoding.GetEncoding(1252);
  System.Console.Out.WriteLine("œil"); 

  string euro = Console.In.ReadLine();

  Console.Out.WriteLine(euro);
}

结束编辑

希望,这会有所帮助。

【讨论】:

  • 为什么要使用互操作? Console.InputEncoding = Encoding.GetEncoding("Windows-1252"); 不工作吗?
  • @L.B 你是对的。我已更新我的答案以显示您建议的解决方案。
【解决方案2】:

欧元符号(€):Unicode 0x20ac 也是 UTF-8 字节序列 0xE2 0x82 0xAC。 范围不是 0x80-0x9F。

char Euro = Convert.ToChar(0x20ac);
Console.WriteLine(Euro);
Console.WriteLine(Convert.ToChar(0x80));

命令行输入this

>csc sample.cs
>chcp 65001

命令行窗口属性(字体选项卡)处的字体更改 TrueTypeFont(“Consoleas”或“Lucida Console”选择)

>sample
€
?

(?: 括在正方形中)。 字符代码检查字体调色板大小写 0x80-0x9F。尚未为其分配支持 Unicode 的字体。

【讨论】:

  • 他已经可以将unicode写入控制台了,这是关于阅读的。
  • 在某些编码(例如 8859-15)中位于 0x80-0x9f 范围内。另外,wtf 是字体调色板大小写吗?
  • @J.Kommer 好吧,在我的例子中是不相关的部分。它的删除。
  • @BLUEPIXY,如果您的问题是针对我的,请使用 SO 文档中涵盖的评论通知系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多