UTF-8は可変長であるため、最近、文字セットに関する問題に直面しましたが、文字セットを掘り下げていたときにこの疑問が思い浮かびました。たとえば、「A single」は「410754」として保存されます(Aのユニコードは41、アラビア文字のユニコードは0754です。 2バイト文字ですか?なぜ4107を1つのダブルバイト文字として、54をシングルバイト文字と見なさないのですか?
たとえば、「Aݔ」は「410754」として保存されます
これはUTF-8の仕組みではありません。
U + 0000からU + 007F(別名ASCII)の文字は、シングルバイトとして保存されます。それらは、コードポイントがUTF-8表現と数値的に一致する唯一の文字です。たとえば、U + 0041は、バイナリの0x41
である0100001
になります。
他のすべての文字は、複数バイトで表されます。 U + 0080〜U + 07FFはそれぞれ2バイトを使用し、U + 0800〜U + FFFFはそれぞれ3バイトを使用し、U + 10000〜U + 10FFFFはそれぞれ4バイトを使用します。
UTF-8は、ASCIIに使用されるシングルバイト値がマルチバイトシーケンスで使用される値と重複しないように設計されているため、1つの文字が終了し、次の文字が開始する場所を知っています。 0x00
から0x7F
は、ASCIIおよびそれ以外の場合にのみ使用されます。0x7F
の上のバイトは、マルチバイトシーケンスにのみ使用されます。 、マルチバイトシーケンスの先頭で使用されるバイトは、それらのシーケンス内の他の位置でも発生しません。
そのため、コードポイントをエンコードする必要があります。次のバイナリパターンを検討してください。
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
最初のバイトの1の量は、次のバイトのうち何個が同じ文字にまだ属しているかを示します。シーケンスに属するすべてのバイトは、バイナリの10
で始まります。文字をエンコードするには、そのコードポイントをバイナリに変換し、xを埋めます。
例として、U + 0754はU + 0080とU + 07FFの間にあるため、2バイトが必要です。バイナリの0x0754
は11101010100
であるため、xをこれらの数字に置き換えます。
110 11101 10 101
短い答え:
UTF-8は、テキストストリーム内の各byteのtypeを明白に識別できるように設計されています。
あなたの例Aݔ
は、UnicodeコードポイントU + 0041およびU + 0754で構成され、UTF-8で次のようにエンコードされます。
1000001 11 11101 1 010100
したがって、デコード時には、UTF-8は最初のバイトが1バイトコードでなければならず、2番目のバイトが2バイトコードの先頭バイトでなければならず、3番目のバイトが継続バイトでなければならず、2番目のバイトは2バイトコードの先頭バイトであり、2番目と3番目のバイトが一緒になってこの2バイトコードを形成する必要があります。
here UTF-8がUnicodeコードポイントをエンコードする方法を参照してください。
明確にするために、ASCIIは標準の7ビットを意味しますASCIIおよび拡張された8ビットではありませんASCII 。
したがって、最初のバイトの一部(0x80〜0xFF)はデュアルバイト表現になり、2バイトの2番目のバイトの一部(0x0800〜0xFFFF)は完全な3バイト表現になります。
4バイト表現は、最下位の3バイトと、利用可能な「16.777.215」の1.114.111のみを使用します
Xls here があります
つまり、インタープリターは、バイナリパターンを見つけたときにNUL(0)バイトを「ジャンプ」する必要があります。
これが誰かを助けることを願っています!