【问题标题】:Read text file with (multiple / mixed / more than one) encoding使用(多个/混合/多个)编码读取文本文件
【发布时间】:2012-10-07 18:02:20
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 最好提供几行的样本(以十六进制表示)。这是一个非常奇怪的文件。
  • 如果您提供样本,请确保它包含编码特定字符,而不仅仅是一些简单的 ascii 字符,以证明编码/解码过程的正确性。

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


【解决方案1】:

假设有关编码的所有元数据都将采用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多