web-dev-qa-db-ja.com

UTF-8エンコーディングは、シングルバイト文字とダブルバイト文字をどのように識別しますか?

UTF-8は可変長であるため、最近、文字セットに関する問題に直面しましたが、文字セットを掘り下げていたときにこの疑問が思い浮かびました。たとえば、「A single」は「410754」として保存されます(Aのユニコードは41、アラビア文字のユニコードは0754です。 2バイト文字ですか?なぜ4107を1つのダブルバイト文字として、54をシングルバイト文字と見なさないのですか?

16

たとえば、「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の上のバイトは、マルチバイトシーケンスにのみ使用されます。 、マルチバイトシーケンスの先頭で使用されるバイトは、それらのシーケンス内の他の位置でも発生しません。

そのため、コードポイントをエンコードする必要があります。次のバイナリパターンを検討してください。

  • 2バイト:110xxxxx 10xxxxxx
  • 3バイト:1110xxxx 10xxxxxx 10xxxxxx
  • 4バイト:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

最初のバイトの1の量は、次のバイトのうち何個が同じ文字にまだ属しているかを示します。シーケンスに属するすべてのバイトは、バイナリの10で始まります。文字をエンコードするには、そのコードポイントをバイナリに変換し、xを埋めます。

例として、U + 0754はU + 0080とU + 07FFの間にあるため、2バイトが必要です。バイナリの0x075411101010100であるため、xをこれらの数字に置き換えます。

110 11101 10 101

27
CharlotteBuff

短い答え:

UTF-8は、テキストストリーム内の各bytetype明白に識別できるように設計されています。

  • 1バイトコード(ASCII文字のみ)は​​すべてで始まります。
  • 2バイトコードの先頭バイト 2つの1で始まり、その後に0が続きます(つまり11
  • バイトコードの先頭バイト 3つの1で始まり、その後に0が続きます(つまり111
  • 4バイトコードの先頭バイト 4つの1で始まり、その後に0が続きます(つまり1111
  • 継続バイト(すべてのマルチバイトコードの)単一の1の後に0が続く(つまり1

あなたの例は、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コードポイントをエンコードする方法を参照してください。

15
weibeld

明確にするために、ASCIIは標準の7ビットを意味しますASCIIおよび拡張された8ビットではありませんASCII 。

したがって、最初のバイトの一部(0x80〜0xFF)はデュアルバイト表現になり、2バイトの2番目のバイトの一部(0x0800〜0xFFFF)は完全な3バイト表現になります。

4バイト表現は、最下位の3バイトと、利用可能な「16.777.215」の1.114.111のみを使用します

Xls here があります

つまり、インタープリターは、バイナリパターンを見つけたときにNUL(0)バイトを「ジャンプ」する必要があります。

これが誰かを助けることを願っています!

1
jmcollantes