UnicodeとUTF-8/16/32の雑な説明

Unicode

  • 世界のほとんどの文字は基本多言語面 (第0面, U+0000~U+FFFF) に収録
  • マイナーな漢字や絵文字などのは第1面~第16面 (U+10000~U+10FFFF) に収録
  • UTF-8/16/32は、Unicodeをバイト列で表すエンコードの仕方の違い
  • いずれにしても、シフトJISコードのようなダメ文字問題は発生しない

UTF-8

  • 1文字1~4バイトの可変長
  • 英数字(ASCII文字) は1バイト、ASCIIコードと互換性がある
  • その他の欧文は2バイト
  • メジャーな漢字や日本語の文字は3バイト (全角英数字、半角カナ含む)
  • マイナーな漢字や絵文字は4バイト
  • Webページなど、アプリケーションの入出力形式・保存形式によく使われる

UTF-16

  • 1文字2バイトまたは4バイト
  • 世界のほとんどの文字は2バイト
  • マイナーな漢字や絵文字などは4バイト
  • WindowsJavaなどの内部形式に使われる

UTF-32

  • すべての文字が1文字4バイトの固定長
  • 処理は簡単だが、メモリ効率は良くない

UTF-8エンコード

  • 1バイト文字 (U+0000~U+007F):0固定+7bit
  • 2バイト文字 (U+0080~U+07FF):(110固定+5bit) + (10固定+6bit) = 合計11bit
  • 3バイト文字 (U+0800~U+FFFF):(1110固定+4bit) + (10固定+6bit) + (10固定+6bit) = 合計16bit
  • 4バイト文字 (U+10000~U+10FFFF):(11110固定+3bit) + (10固定+6bit) + (10固定+6bit) + (10固定+6bit) = 合計21bit
  • 最上位bitが 10 でないバイトを数えれば文字数が分かる

UTF-16エンコード

UTF-32エンコード

Unicodeのブロック概略

詳細は ブロック (Unicode) - Wikipedia を参照。
基本多言語面のブロックの概略は下記の通り。

範囲 ブロック名 主な対応言語
U+0000..U+007F 基本ラテン文字 英語 (ASCII文字と互換)
U+0080..U+00FF ラテン1補助 UTF-8ではここから2バイト文字
ドイツ語、フランス語など西欧と北欧の言語
U+0100..U+017F ラテン文字拡張A チェコ語ポーランド語など東欧のラテン文字言語
U+0180..U+024F ラテン文字拡張B 特殊なラテン文字、非欧州のラテン文字言語
U+0250..U+02AF IPA拡張 IPA(国際音声記号)
U+02B0..U+036F (いろいろ) ダイアクリティカルマークなど
U+0370..U+03FF ギリシア文字 ギリシャ
U+0400..U+04FF キリル文字 ロシア語など東欧のキリル文字言語
U+0500..U+052F キリル文字補助 特殊なキリル文字
U+0530..U+07FF (いろいろ) アラビア語ヘブライ語など中東の言語
U+0800..U+2DFF (いろいろ) UTF-8ではここから3バイト文字
ヒンディー語などインド、東南アジアの言語、その他
U+3000..U+303F CJKの記号 句読点など
U+3040..U+309F 平仮名 ひらがな
U+30A0..U+30FF 片仮名 カタカナ
U+3100..U+4DFF (いろいろ) 東アジアの特殊な文字、記号
U+4E00..U+9FFF CJK統合漢字 漢字
U+A000..U+FFFF (いろいろ) その他
ハングル(U+AC00~U+D7A3)
全角英数字(U+FF21~U+FF5A)
半角カタカナ(U+FF61~U+FF9F)