軽く調べてみた。
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になる。
- エンディアンに関係なくEF BB BF
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数が少なくなる。