使用(多个/混合/多个)编码读取文本文件

时间:2012-10-07 18:02:20

标签: c# text utf-8 character-encoding globalization

我有一个包含多个编码的文本文件,其中要使用的编码本身在文本文件中指定(vCard格式是允许此操作的示例)。这是一个例子:

charset=windows-1251: ABCDE
charset=utf-8: VWXYZ

...其中“ABCDE”将被解释为编码“windows-1251”,而“VWXYZ”将被解释为UTF8。最终,我希望它全部转换为标准字符串(在C#中为UTF2 / UTF16)。

我想我想使用RealAllText(),因为如果没有另外指定,这显然有助于自动默认编码。如上所述指定charset时,将覆盖默认编码。

不幸的是,我还需要进行一些文本解析来查找各种编码,所以我认为需要ReadAllBytes(),所以我可以用更原始的格式逐个字符地解析。

我希望它也快。处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

假设有关编码的所有元数据都将采用ASCII格式,您可以使用一些宽松的基于单字节的编码对其进行解码,这样您就可以照常解析文本。然后使用适当的编码重新分析(从字节)每个字符串。

一些愚蠢的示例代码:

var encoding = Encoding.GetEncoding("Windows-1252");
string asString = System.IO.File.ReadAllText("C:/Temp/test.txt", encoding);
byte[] asBytes = System.IO.File.ReadAllText("C:/Temp/test.txt");

foreach(var entry in ParseFile(aString))
{
    int start = entry.PositionInString;
    // Since we used a one-byte encoding, we can use this location
    // directly in the byte-array.

    int length = entry.Length;
    string encoding = entry.Encoding;
    string decodedEntry = Encoding.GetEncoding(encoding)
                                  .GetString(bytes, start, length);
    Console.WriteLine(decodedEntry);
}