24

我收到了以ISO 88591-1格式保存的文本文件,其中包含来自 Latin-1 范围的重音字符(以及普通的 ASCII az 等)。如何使用 C# 将这些文件转换为UTF-8,以便 ISO 8859-1 中的单字节重音字符成为有效的 UTF-8 字符?

我尝试使用带有 ASCIIEncoding 的 StreamReader,然后通过实例化编码ascii和编码utf8然后使用将 ASCII 字符串转换为 UTF-8,Encoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) )但重音字符被呈现为问号。

我错过了什么步骤?

4

2 回答 2

43

你需要得到正确的Encoding对象。ASCII 顾名思义:ASCII,意思是它只支持 7 位 ASCII 字符。如果您要做的是转换文件,那么这可能比直接处理字节数组更容易。

using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName,
                                       Encoding.GetEncoding("iso-8859-1")))
{
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
                                           outFileName, Encoding.UTF8))
    {
        writer.Write(reader.ReadToEnd());
    }
}

但是,如果您想自己拥有字节数组,使用Encoding.Convert.

byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
    Encoding.UTF8, data);

然而,重要的是要注意,如果你想走这条路,那么你不应该使用基于编码的字符串阅读器,比如StreamReader你的文件 IO。FileStream会更适合,因为它将读取文件的实际字节。

为了充分探索这个问题,这样的事情会起作用:

using (System.IO.FileStream input = new System.IO.FileStream(fileName,
                                    System.IO.FileMode.Open, 
                                    System.IO.FileAccess.Read))
{
    byte[] buffer = new byte[input.Length];

    int readLength = 0;

    while (readLength < buffer.Length) 
        readLength += input.Read(buffer, readLength, buffer.Length - readLength);

    byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
                       Encoding.UTF8, buffer);

    using (System.IO.FileStream output = new System.IO.FileStream(outFileName,
                                         System.IO.FileMode.Create, 
                                         System.IO.FileAccess.Write))
    {
        output.Write(converted, 0, converted.Length);
    }
}

在此示例中,buffer变量被文件中的实际数据填充为 a byte[],因此不进行任何转换。Encoding.Convert指定源和目标编码,然后将转换后的字节存储在名为...的变量中converted。然后将其直接写入输出文件。

就像我说的,第一个选项使用StreamReaderandStreamWriter会更简单,如果这就是你所做的一切,但后一个例子应该给你更多关于实际发生的事情的提示。

于 2010-04-07T19:59:04.553 回答
15

如果文件相对较小(例如,约 10 兆字节),您只需要两行代码:

  string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
  System.IO.File.WriteAllText(outPath, txt);
于 2010-04-07T20:31:01.817 回答