「おそらく最も人気のあるエンコーディングの1つであるUTF-16は有害と見なされるべきですか?」
なぜこの質問をするのですか?
UTF-16が実際に可変長エンコードであるという事実を知っているプログラマーは何人いますか?これにより、サロゲートペアとして表されるコードポイントがあり、複数の要素を取ることができます。
知っている; Javaの文字列、C#の文字列、Win32 API、Qt GUIライブラリ、ICU Unicodeライブラリなど、多くのアプリケーション、フレームワーク、およびAPIはUTF-16を使用します。しかし、すべての処理には、処理に多くの基本的なバグBMP以外の文字(2つのUTF-16要素を使用してエンコードする必要のある文字)。
たとえば、次の文字のいずれかを編集してみてください。
- 𝄞(U + 1D11E)音楽記号Gクレフ
- U(U + 1D565)数学的なダブルトラックスモールT
- 𝟶(U + 1D7F6)数学的なモノスペースDIGIT ZERO
- 𠂊 (U + 2008A)ハン・キャラクター
インストールしたフォントによっては、見逃す場合があります。これらのキャラクターはすべてBMP(Basic Multilingual Plane)の外部にあります。これらの文字が表示されない場合は、Unicode Character referenceでそれらを確認してみてください。
たとえば、Windowsでこれらの文字を含むファイル名を作成してみてください。「バックスペース」でこれらの文字を削除して、UTF-16を使用するさまざまなアプリケーションでの動作を確認してください。私はいくつかのテストを行いましたが、結果は非常に悪いです:
- Operaでの編集に問題があります(バックスペースで2回押す必要がある削除)
- メモ帳はそれらを正しく処理できません(バックスペースで必要な2つのプレスを削除します)
- ウィンドウダイアログでのファイル名の編集が壊れている(バックスペースで2回押す必要がある削除)
- すべてのQT3アプリケーションはそれらを処理できません-1 つのシンボルではなく2つの空の正方形を表示します。
u'X'!=unicode('X','utf-16')
XがBMPの外の文字である場合、一部のプラットフォームで直接使用すると、Pythonはそのような文字を誤ってエンコードします。- Python 2.5 unicodedataは、PythonがUTF-16 Unicode文字列でコンパイルされている場合、そのような文字のプロパティを取得できません。
- StackOverflowは、Unicode文字として直接編集された場合、これらの文字をテキストから削除するようです(これらの文字はHTML Unicodeエスケープを使用して表示されます)。
- WinForms TextBoxは、MaxLengthで制限されている場合、無効な文字列を生成する場合があります。
このようなバグは、UTF-16を使用する多くのアプリケーションで非常に簡単に見つけることができるようです。
だから...あなたはUTF-16は有害と見なされるべきだと思いますか?