c# - TextWriter.ReadToEnd 与 Unix wc 命令

标签 c# c unicode mono

另一个问题。 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/

相关文章:

c - 使用递归在 C 中反转字符串

c++ - 表示任何 double 值所需的最大字符长度是多少?

string - C++ 将 UnicodeString 转换为 String

c# - 在选项卡控件中使用户控件可调整大小

c - 如何在最小化时间的同时最小化指针

c# - 将 razor (cshtml) 和 c# 项目添加到 Visual Studio vb 网站是否错误?

c++ - 在 Windows 中获取替代文件名

php - 特殊字符显示为 ?分数

c# - C# 动态类型和静态类型

c# - 使用父对象创建子对象