代码之家  ›  专栏  ›  技术社区  ›  Patrick Desjardins

C:在控制台中字符显示不好,为什么?

  •  3
  • Patrick Desjardins  · 技术社区  · 17 年前

    下面的图片解释了所有:

    alt text http://img133.imageshack.us/img133/4206/accentar9.png

    变量textfinput来自 File.ReadAllText(path); 还有像“_”这样的人物……不显示。当我运行单元测试时,一切都很好!我看到他们…为什么?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Konrad Rudolph    17 年前

    .NET类( System.IO.StreamReader 以及类似的代码)采用utf-8作为默认编码。如果要读取不同的编码,必须将其显式传递给适当的构造函数重载。

    还要注意,没有一种编码称为ansi。您可能指的是Windows代码页1252,又名__西欧__。请注意,这与其他国家/地区的Windows默认编码不同。当您尝试使用时,这是相关的 System.Text.Encoding.Default 因为这实际上不同于系统。

    /编辑:看来你误解了我的回答和评论:

    1. 代码中的问题是,您需要告诉.NET您使用的是什么编码。
    2. 另一句话,说ansi可以指 不同的 编码与你的问题无关。顺便说一句,这只是一句防止误解的话(好吧,那句话适得其反)。

    因此,最后一点:您的问题的解决方案应该是以下代码:

    string text = System.IO.File.ReadAllText("path", Encoding.GetEncoding(1252));
    

    这里的重要部分是使用适当的 System.Text.Encoding 实例。

    但是,这假设您的编码确实是windows-1252(但我相信记事本+就是“ansi”的意思)。我不知道为什么努尼特读你的文章时会正确显示。我认为nunit或者有某种文本编码的自动发现,或者nunit使用一些奇怪的默认值(即不是utf-8)。

    哦,顺便说一句:ansi_实际上是指__美国国家标准协会__。有很多完全不同的标准将__ansi_作为其名称的一部分。例如,C++(AND)是ANSI标准。

    只有在某些情况下,它才(不精确地)用于指代Windows编码。但即使在那里,正如我试图解释的,它通常也不指 具体的 编码,而不是Windows用作不同国家/地区默认值的一类编码。其中之一是windows-1252。

        2
  •  1
  •   Foredecker    17 年前

    尝试使用设置控制台会话的输出代码页 chcp 命令。Windows支持的代码页有 here , here here . 记住,基本上控制台非常简单:它通过使用代码页来定义将要显示的字形来显示uncicode或dbcs字符。

        3
  •  -1
  •   Patrick Desjardins    17 年前

    我不知道为什么它与nunit一起工作,但是我用notepad++打开了文件,我看到了格式为ansi的文件。现在我转换成了UTF-8,它开始工作了。

    我仍然想知道为什么它是与努尼特工作,而不是在控制台?但至少现在它起作用了。

    更新 我不明白为什么我对这个问题投了反对票,在这个答案中,因为这个问题仍然很好,为什么在控制台中我不能读取ansi文件,但在nunit中我可以?

    推荐文章