使用.NET如何转换包含Latin-1的重音字符为UTF-8 ISO 8859-1编码的文本文件
-
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
变量转换的字节。然后这被直接写入输出文件中。
就像我说的,用StreamReader
和StreamWriter
第一种选择将是简单得多,如果这是你在做什么,但后者的例子应该给你更多的是暗示的,以什么实际发生的。
其他提示
如果文件比较小(比如〜10兆字节),你只需要两行代码:
string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
System.IO.File.WriteAllText(outPath, txt);