20
UTF-16は有害と見なされるべきですか?
「おそらく最も人気のあるエンコーディングの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は有害と見なされるべきだと思いますか?
432
unicode