1

在David的帮助下,我终于解决了将特殊字符 (0x80...0x9F) 写入 Windows 控制台的问题:

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

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

string text = System.Console.ReadLine ();

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

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

但这无济于事。

4

2 回答 2

3

您可以设置控制台应用程序的输入代码页来读取这些特殊字符。有一个名为 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);
}

编辑:

AS LB 建议您也可以使用 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);
}

结束编辑

希望这可以帮助。

于 2011-10-29T15:44:45.067 回答
-3

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

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

命令行输入这个

>csc sample.cs
>chcp 65001

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

>sample
€
?

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

于 2011-10-29T15:25:37.843 回答