从StreamReader读取文件时的c#编码问题(问号)

时间:2014-02-18 15:09:46

标签: c# encoding

从Windows Phone应用程序中读取.txt文件时出现问题。

我制作了一个简单的应用程序,它从.txt文件中读取一个流并打印出来。

不幸的是,我来自意大利,我们有很多带口音的字母。这就是问题所在,实际上所有重音字母都打印成问号。

以下是示例代码:

var resourceStream = Application.GetResourceStream(new Uri("frasi.txt",UriKind.RelativeOrAbsolute));
            if (resourceStream != null)
            {
                {
                    //System.Text.Encoding.Default, true
                    using (var reader = new StreamReader(resourceStream.Stream, System.Text.Encoding.UTF8))
                    {
                        string line;
                        line = reader.ReadLine();

                        while (line != null)
                        {
                            frasi.Add(line);
                            line = reader.ReadLine();       
                        } 
                    }
                }

所以,我问你如何避免这件事。

一切顺利。

[编辑:]解决方案:我没有确保文件是用UTF-8编码的 - 我用正确的编码保存了它,它就像一个魅力。谢谢奥斯卡

2 个答案:

答案 0 :(得分:15)

您需要使用Encoding.Default。变化:

using (var reader = new StreamReader(resourceStream.Stream, System.Text.Encoding.UTF8))

using (var reader = new StreamReader(resourceStream.Stream, System.Text.Encoding.Default))

答案 1 :(得分:2)

如果您不知道源数据的确切编码,那么您已经注释掉了应该使用的内容。 System.Text.Encoding.Default使用操作系统当前ANSI代码页的编码,并提供正确编码的最佳机会。这应检测当前区域设置/编码并使用它们。

但是,从MSDN警告:

  

不同的计算机可以使用不同的编码作为默认编码,默认编码甚至可以在一台计算机上更改。因此,从一台计算机流式传输到另一台计算机或甚至在同一台计算机上不同时间检索的数据可能会被错误地翻译。此外,Default属性返回的编码使用最适合的回退将不受支持的字符映射到代码页支持的字符。出于这两个原因,通常不建议使用默认编码。为了确保正确解码编码的字节,您的应用程序应使用Unicode编码,例如UTF8Encoding或UnicodeEncoding,以及前导码。另一种选择是使用更高级别的协议来确保使用相同的格式进行编码和解码。

尽管如此,根据我对来自不同来源和不同文化的数据的经验,这是提供最一致的结果的开箱即用的... Esp。对于变音符号的情况,当从ANSI转换为UTF8时会变成问号。

我希望这会有所帮助。