输出文件中没有正确显示C#字母

pet*_*ski 1 c# encoding streamwriter

我在C#工作,这是我的代码:

        Encoding encoding;
        StringBuilder output = new StringBuilder();

        //somePath is string
        using (StreamReader sr = new StreamReader(somePath))
        {
            string line;
            encoding = sr.CurrentEncoding;
            while ((line = sr.ReadLine()) != null)
            {
                //make some changes to line
                output.AppendLine(line);
            }
        }

        using (StreamWriter writer = new StreamWriter(someOtherPath, false))//encoding
        {
            writer.Write(output);
        }
Run Code Online (Sandbox Code Playgroud)

在somePath上的文件中,我有像å这样的挪威字符.但是,在someOtherPath中的文件中,我得到问号而不是它们.我认为这是一个编码问题,所以我尝试获取输入文件编码并将其授予输出文件.它没有结果.我尝试使用谷歌浏览器打开文件并为其提供所有可能的编码,但这些字母与输入文件中的字母不同.

Jon*_*eet 7

StreamReader只能对某些编码做出猜测.理想情况下,你应该找出该文件的编码真的是,那么用它来读取文件.是什么创建了文件,是什么让你正确阅读?后一个程序是否公开了它使用的编码?(例如,它可能使用类似Windows-CP1252的东西.)

如果可以的话,我个人建议使用UTF-8作为输出编码,但这取决于你是否能控制读取输出的内容.

编辑:好的,现在我看到了文件,我可以确认它不是 UTF-8."direktør"一词表示为这些字节:

64 69 72 65 6b 74 f8 72
Run Code Online (Sandbox Code Playgroud)

因此,非ASCII字符是单字节(F8),它不是字符的有效UTF-8表示.

可能是ISO-Latin-1 - 它不清楚(有多种编码可以匹配).如果是,您可以使用:

Encoding encoding = Encoding.GetEncoding(28591);

using (TextReader reader = new StreamReader(filename, encoding))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

(或者,用来File.ReadAllLines简化生活.)

您需要单独计算出您想要的输出编码.

编辑:这是一个简短但完整的程序,我针对您提供的文件运行,并且已正确将字符转换为UTF-8:

using System;
using System.IO;
using System.Text;

class Test
{
    static void Main()
    {
        Encoding encoding = Encoding.GetEncoding(28591);
        StringBuilder output = new StringBuilder();
        using (TextReader reader = new StreamReader("file.html", encoding))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                output.AppendLine("Read line: " + line);
            }
        }
        using (StreamWriter writer = new StreamWriter("output.html", false))
        {
            writer.Write(output);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Srcee:鉴于`StreamReader`默认为UTF-8,听起来不太可能.要么你的更改搞砸了,要么Chrome实际上*正在适应不同的编码.你能在*binary*编辑器中打开文件并发布用于组成挪威字符的字节吗? (2认同)