38731


**ASCII範囲に収まらない日本の文字は2バイトに当てはまる、と理解していたのですが、UTF-8だと日本語1文字が3バイトになるのはなぜですか？**  
・恐らく割当方式が異なると思うのですが、何が違うのですが？  
・何が目的で変更されたのでしょうか？  
・メリットは？


CC BY-SA 3.0
2017-10-15T14:28:06.983
38728
2017-10-15T16:53:41.763
2017-10-15T16:53:41.763
754
7886
question
unicode 文字コード
UTF-8で日本語1文字が3バイトなのはなぜ？


おそらく、ひらがな１文字が２バイトのエンコーディングということで、シフト JIS で符号化されたひらがなを想定しているのかなと思っています。シフト JIS
は日本語文字を表現するために作られた文字符号化方式なので、日本語に絞ってエンコードを最適化できるので、日本語文字を2バイトの範囲に収めることができます。

Unicode は、世界のすべての文字をまずコードポイントでもって表して (U+NNNN と表記される)
、次にそのコードポイントからバイト列への変換を定義することで、全世界共通の文字符号化を目指す体系です。全世界の文字をエンコードできることがメリットです。

Unicode のコードポイント -> バイト列への変換方式にはいくつかあり、その中でも一番よく使われているであろう方式は utf-8 です。 utf-8
のメリットは、 ASCII エンコードの上位互換であるため、いろいろと取り回しが効きやすいところです。

Unicode において、たとえばひらがなの「あ」は、 U+3042 です。そして、 utf-8 の符号化は、以下のバイト数でもって行われます

  * U+0000 ~ U+007F -> 1 バイト ( `0xxxxxxx`)
  * U+0080 ~ U+07FF -> 2 バイト ( `110xxxxx`, `10xxxxxx` )
  * U+0800 ~ U+FFFF -> 3 バイト ( `1110xxxx`, `10xxxxxx`, `10xxxxxx` )
  * U+10000 ~ U+10FFFF -> 4 バイト ( `11110xxxx`, `10xxxxxx`, `10xxxxxx`, `10xxxxxx` )

utf-8 においては、もともとひらがななどの日本語文字は 3 バイトで表されます。一部の漢字は U+10000
以降にあって、なので４バイトになったりします。


CC BY-SA 3.0
2017-10-15T16:25:21.977
38731
2017-10-15T16:42:05.900
2017-10-15T16:42:05.900
754
754
38728
answer