サロゲートペア(または同等に、アプリが基本多言語面外の文字を必要とする可能性)を無視することに満足している場合、UTF-16にはいくつかの優れたプロパティがあります。これは、基本的に、コード単位ごとに常に2バイトを必要とし、すべてのBMP文字を表すためです。それぞれ1つのコードユニット。
プリミティブ型を考えてみましょうchar
。インメモリ表現としてUTF-8を使用し、すべてのUnicode文字を処理したい場合、それはどのくらいの大きさにする必要がありますか?最大4バイトになる可能性があります...つまり、常に4バイトを割り当てる必要があります。その時点で、UTF-32を使用したほうがよいでしょう。
もちろん、表現としてUTF-32を使用することもできますが、char
表現にはUTF-8を使用しstring
、変換を進めていきます。
UTF-16の2つの欠点は次のとおりです。
- すべての文字がBMPに含まれているわけではないため、Unicode文字あたりのコード単位の数は可変です。絵文字が普及するまで、これは日常的に使用される多くのアプリに影響を与えませんでした。最近では、確かにメッセージングアプリなどの場合、UTF-16を使用する開発者はサロゲートペアについて本当に知る必要があります。
- プレーンASCII(少なくとも西側では多くのテキストがあります)の場合、同等のUTF-8エンコードテキストの2倍のスペースが必要です。
(補足として、WindowsはUnicodeデータにUTF-16を使用していると思います。また、相互運用上の理由から.NETがそれに続くことは理にかなっています。しかし、それは質問を1つのステップに押し上げるだけです。)
サロゲートペアの問題を考えると、言語/プラットフォームが相互運用要件なしでゼロから設計されている場合(ただし、テキスト処理はUnicodeに基づいている場合)、UTF-16は最良の選択ではないでしょう。UTF-8(メモリ効率が必要で、n番目の文字に到達するという点で処理の複雑さを気にしない場合)またはUTF-32(その逆)のいずれかがより適切な選択です。(n番目の文字に到達する場合でも、正規化形式が異なるなどの理由で「問題」があります。テキストは難しいです...)