こんにちは。kzです。

僕の長年の疑問を解決しようと思います。それはコンピュータが「あ」という文字をどのように理解しているかです。同じ疑問を持たれている方は多いはず、、、?

1バイト文字

1bitは0か1が入る箱です。これが8つ集まって1byteです。1byteは00000000~11111111のように表現できるので例えば

  • 00000000を「あ」
  • 00000001を「い」
のようにしていくと1byteは2^8=256個の情報を対応づけられます。なので256文字以内だと1byteで表現できますね。例えばアルファベットは26文字です。このように1byteで表現できる文字を1バイト文字と言います。また、対応付る文字を文字集合、それにビットを対応づけたものを文字コード(符号化文字集合)と言います。下のようにACSIIは一例です。
おや?UTF-8 Unicodeというものがありますね。これについては下で説明します。ところで、日本語は、、?平仮名だけだと約70なので大丈夫ですが、常用漢字は2000を超えます。これではまずい、

Unicode

上でUnicodeなるものが登場しました。これも文字コードの一種です。

  • Unicode: 世界中で使われている文字や記号たち
  • JIS: 平仮名とか
  • ASCII: アルファベットと一部の記号

UTF-8

これは符号化方式です。他にShift-JSなどがあります。文字コードを定義したにもかかわらず、なぜこんなものが必要なんでしょう?複数の文字コードを併用する際に必要になるそうです。
  • Unicode: UTF-8
  • JS: Shift-JS
のように異なる文字コードは異なる文字符号化方式を使っているので互換性を持たせる時に使うらしいです。

コードポイント

上の1byteの文字でやったように世界中の文字(Unicode)に対して同様の操作を行った時に付与される個別のコードをコードポイントと呼びます。16真数表示が一般的で先頭に「U+」がつきます。
で、ここから難しいんですけど、コードポイントは符号空間という場所で割り振られているようなんですがそこに「」という概念がありまして、、
正直よく分からないのですが、第ゼロ面の基本多言語面(BMP)だけとりあえず気にすれば良さそうです。

BMPとか

BMPは第ゼロ面です。コード位置はU+0000~U+FFFFです。これをもう少し細かくみます。
  • 1byte(U+0000~U+007F)
ASCII文字
  • 2byte(U+0080~U+07FF)
ギリシャ文字、アラビア文字
  • 3byte(U+0800~U+FFFF)
日常で使う文字はほとんど3バイト: U+0800 ~ U+FFFF だそうです。

Conclusion

とりあえずいろんな方式や文字コードがあったのでコンピュータが「あ」をどのように受け取っているか正確なことはわからないがイメージはできた。UTF-8が最もポピュラーらしいので「あ」は「\xe3\x81\x82」ということにしよう。

この文字はなんバイト?

もうこの時点で、「あ」がなんバイトなんだ、のような話はあまり意味を為さないと思えてくると思いますが、少しまとめます。

異体字セレクタ

元号が令和になりました。で、この「令」の漢字色々ありますよね。経済産業省のホームページには次のような質問がありました。
下に書いてある「異体字セレクタ」ですが今回の
令
令
が異体字に当たります。これらの微妙な違いに対してコードポイントを付与する行為は非常にもったいないと思いませんか?そこでベースとなる漢字を基底文字と呼ばれるものを用意してそれを装飾しようという仕組みが異体字セレクタです。そして参考にある日経の記事によると漢字は2byteから8byteへ変わろうとしているらしいです。

Cのメモリについて勉強しているときにふと気になって調べると色々わかって楽しかったです。でわ

Reference