UTF-8ファイルから擬似ランダム文字を抽出しようとしているとすれば、私は個人的にはランダムな場所にジャンプしてスクロールして、 (私の気持ちは難しい命題です)編集これは間違っています。どのようなものについて:
- が
- はヒューリスティックに文字の数を推測バイト単位でのファイルの長さを確立する - 例えば、いくつかの適切なコーパスから確立された定数によってスケーリングすることで、ファイルが非常に大きい場合や、このファイルのより代表
- かもしれないスケーリング定数を得るために、最初の
n
バイトを調べ、それらが記述する文字数見て1..<guessed number of characters in file>
- に疑似乱数を選択(それはそうしなければならないと思いますが、そうでなければこれを尋ねることはできません)、バッファされた読み込みを使用して:
- ファイルのバイトを読み取り、UTF-8にデコードして、
ここでバッファリングされた読み込みは、文字のバイトが2回の読み込みで分割されたときにコンテキストを失うのを避けるために、最初に2つのバッファを使用する必要があります。 :
読むバッファーA:バイト1000から1999 読むバッファーB:バイト2000から2999
文字が単一のバッファがコンテキストを失うことになる使用して、バイト1998-2001
を占めている場合。
読むバッファーA:私たちは文字にバイトストリームを変換するときに有効バッファで今バイト3000から3999
A はバッファBに従います。
以下@jleedevで述べたように、そして他の回答に見られるように、それは保証文字開始までの「前方スクロール」に実際に簡単で安全です。しかし、上記の文字数見積もりは有用であるかもしれません。
奇数バイト位置にジャンプしない限り、UTF-16も自己同期化します。 Unicodeのエンコーディングは、特に自己同期化するように設計されており、少数のコードユニットをスキップするだけでよいという強力な保証があります。 – Philipp