Unicode 文字を形成するマルチバイト文字を含む可能性がある TCP サーバーからバイト ストリーム バッファを受信しました。これらの文字を検出するために BOM をチェックする方法が常にあるのか、それともどうしたいのか疑問に思っていましたか?
5 に答える
データが UTF-8 であることがわかっている場合は、上位ビットを確認するだけです。
- 0xxxxxxx = 1 バイトの ASCII 文字
- 1xxxxxxx = マルチバイト文字の一部
または、リード/トレイル バイトを区別する必要がある場合:
- 10xxxxxx = マルチバイト文字の 2 番目、3 番目、または 4 番目のバイト
- 110xxxxx = 2 バイト文字の 1 バイト目
- 1110xxxx = 3 バイト文字の 1 バイト目
- 11110xxx = 4 バイト文字の 1 バイト目
UTF-8 では、8 番目のビットがオンになっているものはすべて、マルチバイト コードポイントの一部です。したがって、基本的(0x80 & c)!=0
に各バイトをチェックするのがこれを行う簡単な方法です。
マルチバイト文字を検出する方法はたくさんありますが、残念ながら...どれも信頼できません。
これが返された Web リクエストである場合は、ヘッダーを確認してください。Content-Type ヘッダーは、多くの場合、ページのエンコードを示しているためです (これは、マルチバイト文字の存在を示している可能性があります)。
BOM は無効な文字であり、通常のテキストには表示されないため、BOM を確認することもできます。ただし、それらはオプションであり、多くの場合存在しません (実装、構成などによって異なります)。
BOM はほとんどオプションです。受信元のサーバーがマルチバイト文字を処理している場合、サーバーはこれを知っていると想定し、BOM 用に 2 バイトを保存します。受信したデータがマルチバイト文字列である可能性が高いかどうかを確認する方法を求めていますか?