C#:在Console中字符不能很好地显示,为什么?

时间:2008-10-18 13:19:34

标签: c# .net encoding .net-2.0 io

下图解释了所有:

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

变量textInput来自File.ReadAllText(path);,字符如:'éè...不显示。当我运行我的UnitTest时,一切都很好!我看到了他们......为什么?

3 个答案:

答案 0 :(得分:3)

.NET类(System.IO.StreamReader等)将UTF-8作为默认编码。如果要读取不同的编码,则必须将其显式传递给相应的构造函数重载。

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

/编辑:你似乎误解了我的回答和评论:

  1. 您的代码中的问题是您需要告诉.NET您正在使用的编码。
  2. 另一句话,说“ANSI”可能指的是不同的编码,与你的问题没有任何关系。这只是一个“顺便说一句”的话来防止误解(好吧,那个人适得其反)。
  3. 所以,最后:您的问题的解决方案应该是以下代码:

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

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

    但是,这假设你的编码确实是Windows-1252(但我相信Notepad ++的意思是“ANSI”)。我不知道为什么在NUnit读取时你的文本会正确显示。我想NUnit要么对文本编码有某种自动发现,要么NUnit使用一些奇怪的默认值(即不是UTF-8)。

    哦,顺便说一下:“ANSI”真的是指“美国国家标准协会”。有许多完全不同的标准,其中“ANSI”作为其名称的一部分。例如,C ++(以及其他)也是ANSI标准。

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

答案 1 :(得分:1)

尝试使用chcp命令设置控制台sessin的输出代码页。 Windows支持的代码页是hereherehere。请记住,控制台非常简单:它通过使用代码页来显示将显示的字形来显示UNCICODE或DBCS字符。

答案 2 :(得分:-1)

我不知道为什么它适用于NUnit,但我用NotePad ++打开文件,我看到格式的ANSI。现在我转换为UTF-8并且它可以工作。

我仍然想知道为什么它与NUnit合作而不是在控制台中?但至少它现在有效。

<强>更新 我不明白为什么我对这个问题和这个答案投了反对票,因为问题仍然很好,为什么在控制台中我无法读取ANSI文件但在NUNit中我可以?