UTF-8、UTF-16、UTF-32の使い分けは使い手次第だと思います

Unicode(現時点で最新のUnicode 13.0.0)で扱われる符号化形式及び符号化スキームにはUTF-8UTF-16UTF-32があり、どれを使うかで悩むことがあります。結論としては使い手の使い分けだと思いました。

Unicodeは「文字」*1や制御記号をコードポイント(符号位置)に割り当てており、UTF-16で表せる上限の10FFFF16(1,114,112)が最大です*2

UTF-8UTF-16UTF-32の違いにコードユニット(符号単位)のビット数*3とASCII互換性があります。UTF-8は8ビットでASCII上位互換、UTF-16は16ビットでASCII非互換、UTF-32は32ビットでASCII非互換です。

UTF-8UTF-16はコードユニットのビット数がコードポイントの21ビットよりも小さいため、適宜コードユニットからコードポイントへの変換が必要となります。UTF-32はサイズが大きくなりますが、コードユニットがコードポイントよりも大きいので変換が不要です。

UTF-8はASCIIで収まる文字の多い言語(英語)ではサイズを小さくできます。UTF-16は日本語でよく使う文字が1コードユニットで表せる範囲に配置されているので、日本語ではUTF-32よりもサイズを小さくできます*4UTF-8よりは大きくなりますが英語でも同様です。

また、OSの内部処理の差異もあります。WindowsUTF-16が主体ですが、Unix系(UnixMacAndroid)はUTF-32が主体です。異なる場合は変換が必要となります。

以上から、UTF-8UTF-16UTF-32のどれを使うかはその文書の言語や形式(文章とHTMLタグやJavaScriptの比率など)、自分と想定読者の処理環境により変わるものと考えます。

なお、UTF-16UTF-32エンディアンが絡みますが、ここでは割愛しています。

参考

*1:ここでは「文字」と書きますが、異字体セレクタや結合文字があるので厳密には誤りだと思います。

*2:Unicode 13.0.0公式ドキュメントのChapter 1またはGlossary参照。文字数は143,859。

*3:Glossaryを参照。

*4:UCS-2の名残であるBasic Multilingual Plane (BMP)による。Chapter 1参照。