私は最近Tom Scott from Computerphile talk about UTF-8を見てきたし、それ以降研究のビットは、UTF-8は、バイトごとに次のヘッダーを使用して、最大6バイトの文字をエンコードするために使用することができることを理解する:言語はどのようにしてUTF-8を表現していますか?
0xxx xxxx # 1 Byte character
110x xxxx # 2 Byte character
1110 xxxx # 3 Byte character
1111 0xxx # 4 Byte character
1111 10xx # 5 Byte character
1111 110x # 6 Byte character
そして、 10xx xxxx
を使用して余分なバイトを表現しています(私はRFC3629がこれを4バイトまでしか制限しないことを知っています)。
これは、2,164,286の異なる文字が(予約文字を無視して)エンコードできることを理解していますか? Iは、UTF-8でエンコードされた文字列を格納するchar
アレイを使用することができ、又はIではなく、各UTFを符号化するためにUTF-32のような固定長符号化を使用し、そのようなunsigned long
などの任意の4バイトのタイプを使用することが理論的に
0xxx xxxx # 7 bits => 128
110x xxxx # 5 bits + 6 bits = 11 bits => 2,048
1110 xxxx # 4 bits + 6*2 bits = 16 bits => 65,536
1111 0xxx # 3 bits + 6*3 bits = 21 bits => 2,097,152
# == 2,164,864
-8エンコードされた文字ですが、1バイトまたは2バイトでエンコードされたUTF-8文字のみを使用するテキストではメモリが大幅に増加します。
私はstd::string
がUTF-8で保存することができ、これはsize
とバイト長を返すlength
になりますが、UTF-8は、文字の様々な長さを表すことができれば、どのような言語は、(我々は範囲を限定するためにC++を取るよんと信じてこの質問の中でこれらの文字を内部的に符号化します(std::string
など)。いくつかの制限以下の
からと変換するための責任があるのAPIがあります。例: 'MultiByteToWideChar'と' WideCharToMultiByte'です。 – Raindrop7
@ Raindrop7は真実かもしれませんが、背景に何が起こっているのかという質問に実際には答えません。 –
現在のところ、Unicodeは現在21ビット分のコードポイントしか使用できません(2^16コードポイントの17プレーンのみが実際に指定された、可能な限り32)。 –