1. ホーム
  2. utf-8

UTF-16は何のためにあるのか?

2023-08-25 04:12:17

疑問点

私はUTF-16エンコーディングのポイントを理解したことがありません。 もし、文字列をランダムアクセスとして扱う必要があるなら (つまり、コードポイントはコードユニットと同じです)、UTF-16 はまだ可変長なので、UTF-32 が必要です。 その必要がないのであれば、UTF-16はUTF-8と比較してとんでもなく無駄なスペースに思えます。 UTF-16がUTF-8やUTF-32よりも優れている点は何でしょうか。また、WindowsやJavaがネイティブのエンコーディングとしてUTF-16を使用している理由は何でしょうか?

どのように解決するのですか?

Windows NT が設計されたとき、UTF-16 は存在しませんでした (NT 3.51 は 1993 年に生まれ、UTF-16 は 1996 年に Unicode 2.0 標準で生まれました)。代わりに UCS-2 があり、当時は Unicode で利用できるすべての文字を保持するのに十分だったので、1 コード ポイント = 1 コード ユニットという等価性は実際に正しく、文字列に可変長論理は必要ありません。

しかし、UTF-8 や UTF-32 に移行することはできませんでした。なぜなら、これは API インターフェースにおけるバイナリ互換性を壊してしまうからです (他にもいろいろありますが)。

Java は 1995 年にリリースされたので、UTF-16 は (まだ標準化されていなかったとしても) すでに存在していたと思われますが、NT ベースのオペレーティング システムとの互換性がその選択に何らかの役割を果たしたのではないかと思います (Windows API を呼び出すたびに UTF-8 <-> UTF-16 変換を継続すると速度低下が発生する可能性があります)。


編集

Wikipediaによると、Javaでも同じように、当初はUCS-2をサポートしていたが、J2SE 5.0ではUTF-16に移行したとのことです。

つまり、一般的に、ある API/Framework で UTF-16 が使用されているのを見たとき、それは UCS-2 として始まり (文字列管理アルゴリズムの複雑さを避けるため)、同じコードユニットサイズを維持したまま、BMP の外のコードポイントをサポートするために UTF-16 に移動したためなのです。