2011-02-08 12 views
5

私の理解では、UTF8またはUTF16エンコードファイルへの読み込みは、時折サロゲートバイト(例えば東部言語で使用される)のためランダムにすることはできません。UTF8ファイルのランダム読み込みを行うにはどうすればいいですか?

.NETを使用してファイル内のおおよその位置にスキップし、セミランダム位置からユニコードテキストを読み取るにはどうすればよいですか?

サロゲートバイトを破棄して、単語区切りが読み込みを続けるのを待ちますか?もしそうなら、私はデコードを開始するまで待つべきvalid word breaksは何ですか?

答えて

8

簡単に、UTF-8は自己同期型です。
ファイル内のランダムバイトにジャンプし、スキップリードすべてのバイトが先頭ビット10(継続バイト)で読み込みます。先頭に10がない最初のバイトは、適切なUFT-8文字の開始バイトで、通常のUTF-8エンコーディングを使用して次のバイトを読み取ることができます。

+1

奇数バイト位置にジャンプしない限り、UTF-16も自己同期化します。 Unicodeのエンコーディングは、特に自己同期化するように設計されており、少数のコードユニットをスキップするだけでよいという強力な保証があります。 – Philipp

2

UTF-8ファイルから擬似ランダム文字を抽出しようとしているとすれば、私は個人的にはランダムな場所にジャンプしてスクロールして、 (私の気持ちは難しい命題です)編集これは間違っています。どのようなものについて:

  1. はヒューリスティックに文字の数を推測バイト単位でのファイルの長さを確立する - 例えば、いくつかの適切なコーパスから確立された定数によってスケーリングすることで、ファイルが非常に大きい場合や、このファイルのより代表
  2. かもしれないスケーリング定数を得るために、最初のnバイトを調べ、それらが記述する文字数見て1..<guessed number of characters in file>
  3. に疑似乱数を選択(それはそうしなければならないと思いますが、そうでなければこれを尋ねることはできません)、バッファされた読み込みを使用して:
  4. ファイルのバイトを読み取り、UTF-8にデコードして、

ここでバッファリングされた読み込みは、文字のバイトが2回の読み込みで分割されたときにコンテキストを失うのを避けるために、最初に2つのバッファを使用する必要があります。 :

読むバッファーA:バイト1000から1999 読むバッファーB:バイト2000から2999

文字が単一のバッファがコンテキストを失うことになる使用して、バイト1998-2001を占めている場合。

読むバッファーA:私たちは文字にバイトストリームを変換するときに有効バッファで今バイト3000から3999

A バッファBに従います。


以下@jleedevで述べたように、そして他の回答に見られるように、それ保証文字開始までの「前方スクロール」に実際に簡単で安全です。しかし、上記の文字数見積もりは有用であるかもしれません。

+1

UTF-8は、ジャンプすると文字の始まりを簡単に見つけることができるように特別に設計されています。 –

+0

@jleedevクール、ありがとう。更新しました。 – AakashM

1

UTF-16では、常に偶数バイト位置にジャンプする必要があります。次に、後続のサロゲートが続くかどうかを確認できます。もしそうなら、それをスキップしてください。それ以外の場合は、整形式のUTF-16コードユニットシーケンスの開始時になります(もちろん、ファイルが正式なものであると仮定します)。

UnicodeエンコーディングUTF-8とUTF-16は、特に自己同期化するように設計されており、少数のコードユニットをスキップするだけでよいという強い保証があります。

関連する問題