-2

使用するエンコーディング自体がテキストファイルで指定されている複数のエンコーディングを含むテキストファイルがあります(vCard形式はこれを可能にする例です)。次に例を示します。

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

...ここで、「ABCDE」は「windows-1251」のエンコードとして解釈され、「VWXYZ」はUTF8になります。最終的には、すべてを標準の文字列(C#ではUTF2 / UTF16)に変換する必要があります。

RealAllText()を使用したいと思います。特に指定がない限り、デフォルトのエンコーディングが自動的に役立つように見えるからです。上記のように文字セットを指定すると、デフォルトのエンコーディングが上書きされます。

残念ながら、さまざまなエンコーディングを探すためにテキスト解析も行う必要があるため、ReadAllBytes()が必要になると思います。これにより、より生の形式で文字ごとに解析できます。

私も速くしたいです。これに対処する最良の方法は何ですか?

4

1 に答える 1

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);
}
于 2012-10-27T20:41:24.677 に答える