另一个问题。 Unicode、终端以及现在的 C# 和 wc
。如果我写这段简单的代码
int i=0;
foreach(char c in Console.In.ReadToEnd())
{
if(c!='\n') i++;
}
Console.WriteLine("{0}", i);
并且只输入字符“€”(utf-8 中的 3 个字节),wc
返回 3 个字符(可能使用 wint_t,虽然我没有检查过),但是 ReadToEnd ()
返回 1(一个字符)。在这种情况下 ReadToEnd
的行为到底是什么?我如何知道 ReadToEnd
在幕后做了什么?
我正在运行使用 utf-8.en.US 初始化的 xterm,运行 Ubuntu Linux 和 Mono。
谢谢。
最佳答案
wc
和大多数类 unix 命令根据 C char
数据类型处理字符,该数据类型通常是无符号的 8 位整数。 wc
只是从标准输入中一个字节一个字节地读取,不进行任何转换,并确定有 3 个字符。
.NET 根据其自己的 Char
数据类型处理字符,该数据类型是 16 位无符号整数,表示 UTF-16 字符。控制台类已收到 3 个字节的输入,确定它所连接的控制台是 UTF-8 并将它们正确转换为单个 UTF-16 欧元字符。
关于c# - TextWriter.ReadToEnd 与 Unix wc 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1169246/