tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

UTF-8/UTF-16/UTF-32の違い

軽く調べてみた。

UTF-8

1文字は1byte〜6byteで表される。
(6byteで31bitまでの表現ができる)

  • ASCIIは1byte
  • ISO 8859-1以外のISO 8859の8bit文字は2byte
  • 大抵の日本語文字(半角カナ含む)は3byte
  • 5〜6byteの文字は定義されていないし、する気もなさそう


ISO 8859-1部分に互換性があるため、マルチバイト文字に対応していないような行儀の悪いプログラムでもそのまま動く。


BOMを付ける場合、BOMは3byteになる。


BOMは本来要らないはずだけど、付いていることがある。
文字コードを自動判別する際にはBOMが無いと誤判別することが多いため、
出所不明の文書が飛び交う所では付けたほうがいいかもしれない。
BOM付きをUTF-8、なしを通称UTF-8N(正式名称ではない)という。


既に色々なところで使われているため、
他のシステムと連携しそうな時などには無難な選択となる。

UTF-16

1文字が2byteの1つか2つで表される。
(ASCII、半角カナ等も2byte)

1文字目がU+10000〜U+10FFFFの場合は次の2byteとセットで扱う。
サロゲートペア)

BOMを付ける場合、BOMは2byteになる。

ASCIIが多い場合はUTF-8よりbyte数が多くなり、
逆に日本語が多い場合はUTF-8よりbyte数が少なくなる。

Windowsの世界でUnicodeと書かれていたらUTF-16LEを指す。

UTF-32

全ての文字を4byteで表すため、固定長になる。
厳密には31bitが有効で、そのうち使っているのは21bitだけ(U+0〜U+10FFFF)。


固定長ではあるがUnicodeには非表示文字や結合文字があり、
単純にbyte数÷4が表示上の文字数とはならないため、あまり意味がない。


はてなキーワードが無いくらい使われていない。


BOMを付ける場合、BOMも4byteになる。

メモ

BOM(Byte Order Mark)
Unicodeはリトルエンディアンとビッグエンディアンの両方があり、
それらを判別するために先頭に"ZERO WIDTH NON-BREAKING SPACE"文字を付ける。
これを通称BOMという。BOMは予めエンディアンがわかっていれば省略できる。


出所不明の文書でBOMが省略されている場合には、ビッグエンディアンであるとみなす。