使用.NET如何转换包含Latin-1的重音字符为UTF-8 ISO 8859-1编码的文本文件

StackOverflow https://stackoverflow.com/questions/2595442

  •  25-09-2019
  •  | 
  •  

我被保存在 ISO 88591-1 格式发送文本文件包含来自Latin-1的范围内(以及正常ASCII AZ等)重音字符。如何使用C#,使单字节口音的这些文件转换为 UTF-8 在ISO 8859-1的字符成为有效UTF-8字符?

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

我错过了哪一步?

有帮助吗?

解决方案

您需要获得正确的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变量被填充有该文件作为byte[]在实际的数据,所以没有转换完成。 Encoding.Convert指定源和目的编码,然后存储在名为... converted变量转换的字节。然后这被直接写入输出文件中。

就像我说的,用StreamReaderStreamWriter第一种选择将是简单得多,如果这是你在做什么,但后者的例子应该给你更多的是暗示的,以什么实际发生的。

其他提示

如果文件比较小(比如〜10兆字节),你只需要两行代码:

  string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
  System.IO.File.WriteAllText(outPath, txt);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top