0

クライアントとサーバーは、TCP を介して相互に通信します。サーバーとクライアントは、相互に UTF-8 でエンコードされたメッセージを送信します。

UTF-8 でエンコードする場合、1 文字あたりのバイト数は可変です。1 つの文字を表すのに 1 バイト以上かかる場合があります。

ネットワークストリームでUTF-8でエンコードされたメッセージを読んでいて、それが巨大なメッセージであるとしましょう。私の場合、約145kバイトでした。ネットワーク ストリームから読み取るためにこのサイズのバッファーを作成すると、バイト配列がその量のシーケンシャル メモリを必要とするため、OutMemoryException が発生する可能性があります。

その場合、メッセージ全体が読み取られるまで while ループでネットワーク ストリームから読み取り、断片を小さなバッファー (おそらく 4kb) に読み取ってから、文字列をデコードして連結するのが最善です。

私が疑問に思っているのは、読み取りバッファーの最後のバイトが、実際には複数のバイトで表される文字のバイトの 1 つである場合に何が起こるかということです。読み取りバッファーをデコードすると、次の読み取りの最後のバイトと最初のバイトが無効になるか、間違った文字になります。私の考えでは、これを解決する最も簡単な方法は、非変数エンコーディング (UTF-16 など) を使用してエンコードし、バッファを各文字のバイト数の倍数にすることです (UTF-16 は、 2 乗、UTF-32 は 4 乗)。

しかし、UTF-8 は一般的なエンコーディングであるように思われるので、これは解決済みの問題だと思います。エンコーディングを変更する以外に私の懸念を解決する別の方法はありますか? 順次メモリを使用しないため、連結リスト型オブジェクトを使用してバイトを格納するのがおそらくこれを処理する方法です。

4

1 に答える 1

0

解決済みの問題です。ウーウー!

http://mikehadlow.blogspot.com/2012/07/reading-utf-8-characters-from-infinite.html

于 2013-10-22T19:50:39.800 に答える