我有一个包含多个编码的文本文件,其中要使用的编码本身在文本文件中指定(vCard格式是允许此操作的示例)。这是一个例子:
charset=windows-1251: ABCDE
charset=utf-8: VWXYZ
...其中“ABCDE”将被解释为编码“windows-1251”,而“VWXYZ”将被解释为UTF8。最终,我希望它全部转换为标准字符串(在C#中为UTF2 / UTF16)。
我想我想使用RealAllText(),因为如果没有另外指定,这显然有助于自动默认编码。如上所述指定charset时,将覆盖默认编码。
不幸的是,我还需要进行一些文本解析来查找各种编码,所以我认为需要ReadAllBytes(),所以我可以用更原始的格式逐个字符地解析。
我希望它也快。处理这个问题的最佳方法是什么?
答案 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);
}