質問: **ASCII範囲に収まらない日本の文字は2バイトに当てはまる、と理解していたのですが、UTF-8だと日本語1文字が3バイトになるのはなぜですか?** ・恐らく割当方式が異なると思うのですが、何が違うのですが? ・何が目的で変更されたのでしょうか? ・メリットは?
回答: おそらく、ひらがな1文字が2バイトのエンコーディングということで、シフト 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 以降にあって、なので4バイトになったりします。