Unicode文字セットのUTF-8エンコーディング

Unicodeは文字セットを定義しており,それらの文字には1文字当たり最大20ビットの番号が振られている。この番号を,決められたバイト列に変換する処理方法がエンコーディングだ。例えば「UTF-8」では,いわゆる半角英数字は1バイト,日本語の全角文字は3バイトで表現する。より正確には, Unicodeの文字番号が7ビットまでの文字は1バイト,8ビット以上11ビットまでは2バイト,12ビット以上16ビットまでは3バイト,17ビット以上21ビットまでは4バイトで表現する(図1)。

シフトJISを捨てられるか? | 日経 xTECH(クロステック)

Unicodeのサイズって何で文字ごとに違うんだろうな、と漠然と考えていたけれども、こうして説明してもらうとよく分かる。逆を言うと、そんなことをきちんと考えていなかった自分に少し反省する。確かにこのUTF-8エンコーディングの方式だったら、割り当てられた番号が7ビットまでだったら1バイトで表現できる。まあこれが2バイトでも表現可能なのも問題なんだろうけど。

UTF-8は,通信を考慮して設計されたので,フレームが途切れてバイト列が途中からになった場合でも正しく情報を伝達できる。また,バイト列の後ろからでも,正しく文字を区切れる。あるバイトを見たときに,その上位2ビットが「10」でなければ,それはある1文字を表すバイト列の先頭だと分かるからだ。そしてその文字を構成するバイト数は,先頭のバイトの上位から「1」が連続するビット数で分かる(最上位ビットが「0」だったら1バイト文字である)。

シフトJISを捨てられるか? | 日経 xTECH(クロステック)

可変長だと確かにDBのカラムの容量をどのくらいとっておくべきかという判断も難しい。現状は全文字4バイト換算でとっておくのが安全ということなのだろうか。