UTF-16は有害であると見なされるべきですか?

からMessageBoxW。代わりに、UNICODE定義が後者を処理します。証拠として、これはMS Visual Studio2005のWinUser.hヘッダーからのものです:

#ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif // !UNICODE 

少なくとも、このエラーは、utf8everywhere.orgで修正する必要があります。

提案:

ガイドには、Wideの明示的な使用例が含まれている必要があります-データ構造の文字列バージョン。見逃したり忘れたりしにくくします。ワイド文字列バージョンの関数を使用することに加えて、ワイド文字列バージョンのデータ構造を使用すると、そのような関数のANSI文字列バージョンを誤って呼び出す可能性がさらに低くなります。

例の例:

WIN32_FIND_DATAW data; // Note the W at the end. HANDLE hSearch = FindFirstFileW(widen("*.txt").c_str(), &data); if (hSearch != INVALID_HANDLE_VALUE) { FindClose(hSearch); MessageBoxW(nullptr, data.cFileName, nullptr, MB_OK); } 

コメント

  • 同意しました。ありがとう!ドキュメントを更新します。このドキュメントには、データベースに関するさらなる開発と情報の追加が必要です。言葉遣いの投稿をお待ちしております。
  • @PavelRadzivilovsky _UNICODEはまだあります:(
  • 思い出させてくれてありがとう。cubus、Jelle、 SVNのユーザーをご希望ですか?
  • @Pavelよろしくお願いします!
  • @JelleGeerts:この遅延についてお詫び申し上げます。いつでもメール(リンク先)でお問い合わせいただけます。マニフェストから)またはFacebook。簡単に見つけることができます。ここで提起した問題は修正されたと思いますが(クレジットはありますが)、UTF-8とUTF-16の議論全体が依然として関連しています。貢献これらのプライベートチャネルを通じてお気軽にお問い合わせください。

回答

UCS4とUTF-32は同じです。違いますが、意味はわかります。一方はもう一方のエンコーディングです。ただし、ここでもエンディアネスの戦いが繰り広げられないように、最初からエンディアンネスを指定することを考えてほしいと思います。彼らはそれが来るのを見ることができませんでしたか?少なくともUTF-8はどこでも同じですre(誰かが6バイトの元の仕様に従っている場合を除く)。

UTF-16を使用する場合は、マルチバイト文字の処理を含める必要があります。 2Nをバイト配列にインデックス付けしてN番目の文字に移動することはできません。それをウォークするか、文字インデックスを作成する必要があります。そうしないと、バグが発生します。

C ++の現在のドラフト仕様にはUTF-32およびUTF-16には、リトルエンディアン、ビッグエンディアン、および不特定のバリアントを含めることができます。本当に? Unicodeで、誰もが最初からリトルエンディアンを実行する必要があると指定されていたとしたら、それはすべて簡単だったでしょう。 (私もビッグエンディアンで大丈夫だったでしょう。)代わりに、ある方法で実装した人もいれば、別の方法で実装した人もいました。そして今、私たちは「愚かさで立ち往生しています。ソフトウェアエンジニアになるのは恥ずかしいこともあります。

コメント

  • 不特定のエンディアンには、文字列の読み取り方法を決定するために使用される最初の文字としてBOMが含まれることになっています。 UCS-4とUTF-32は実際に同じです。つまり、0〜0x10FFFFの数値のUCS値が32ビット整数で格納されます。
  • @Tronic:技術的には、これは正しくありません。 UCS-4は任意の32ビット整数を格納できますが、UTF-32は、0xFFFF、0xFFFE、およびすべてのサロゲートなど、交換に不正な非文字コードポイントを格納することを禁じられています。 UTFはトランスポートエンコーディングであり、内部エンコーディングではありません。
  • 異なるプロセッサが異なるバイトオーダーを使用し続ける限り、エンディアンの問題は避けられません。ただし、UTF-16のファイルストレージに”優先”バイトオーダーがあれば良かったかもしれません。
  • UTF-32はコードポイントでは固定幅ですが、文字では固定幅ではありません。 (”文字の組み合わせ”と呼ばれるものを聞いたことがありますか?)したがって、’ 4Nをバイト配列にインデックス付けするだけで、N ‘番目の文字に変換されます。

回答

開発者が十分に注意していれば、害はないと思います。
そして、彼らもよく知っているなら、このトレードオフを受け入れるべきです。

日本のソフトウェア開発者として、UCS-2は十分に大きく、スペースを制限するとロジックが単純化され、ランタイムメモリが削減されるため、UCS-2の制限の下でutf-16を使用するだけで十分です。

コードポイントとバイトが比例していると想定するファイルシステムやその他のアプリケーションがあるため、生のコードポイント番号が固定サイズのストレージに収まることが保証されます。

1つの例は、ファイル名ストレージエンコーディングとしてUCS-2 を指定する NTFSおよびVFATです。

これらの例が本当にUCS-4をサポートするように拡張したい場合は、とにかくすべてにutf-8を使用することに同意できますが、固定長には次のような良い点があります。

  1. can長さごとにサイズを保証します(データサイズとコードポイントの長さは比例します)
  2. ハッシュルックアップにエンコード番号を使用できます
  3. 非圧縮データは適度なサイズです(utf-32 /と比較して) UCS-4)

将来、埋め込みデバイスでもメモリ/処理能力が安い場合、余分なキャッシュミスやページ障害、余分なメモリのためにデバイスが少し遅いことを受け入れる可能性があります使用法ですが、これは近い将来には起こらないと思います…

コメント

  • このコメントを読んでいる人にとっては、UCS-に注目する価値があります。 2はUTF-16と同じものではありません。違いを調べて理解してください。

回答

「最も人気のあるものの1つである必要がありますエンコーディング、UTF-16は有害であると見なされますか?」

かなり可能性がありますが、代替案が必ずしもはるかに優れていると見なされるべきではありません。

基本的な問題は、グリフ、文字、コードポイント、バイトシーケンスなど、さまざまな概念があることです。これらのそれぞれの間のマッピングは、正規化ライブラリを使用しても簡単ではありません。 (たとえば、ラテン語ベースのスクリプトで記述されたヨーロッパ言語の一部の文字は、単一のUnicodeコードポイントで記述されていません。これは、複雑さの最も単純な終わりです!)これは、すべてを正しくすることを意味します。非常に驚くほど難しい。奇妙なバグが予想される(そして、ここでそれらについてただうめき声を上げるのではなく、関係するソフトウェアのメンテナに伝える)。

UTF-の唯一の方法16は、たとえばUTF-8とは対照的に、有害であると見なすことができます。UTF-8は、BMPの外部でコードポイントをエンコードする方法が異なります(サロゲートのペアとして)。コードがコードポイントにアクセスまたは反復する場合は、つまり、違いを認識する必要があります。OTOH、つまり、「文字」を想定する既存のコードの実質的な本体は、常に2バイトの量に収まる可能性があります。間違っている場合はかなり一般的な想定です。少なくとも、すべてを再構築せずに作業を続行します。言い換えると、少なくともそれらのキャラクターを見ることができます。正しく処理されていない!

私はあなたの質問に頭を悩ませ、Unicodeのひどいシバン全体が有害であると見なされるべきであり、誰もが8ビットエンコーディングを使用するべきであると言います。私は(過去20年間で)それがつながるところを見てきました:さまざまなISO 8859エンコーディングに関する恐ろしい混乱に加えて、キリル文字とEBCDICスイートに使用されるもののセット全体、そして…まあ、そのすべての欠点に対するUnicodeはそれを打ち負かします。 「異なる国間のそのような厄介な妥協」の誤解でなければ。

コメント

  • 運を知って、数年で’ UTF-16のスペースが不足していることに気付くでしょう。
  • 根本的な問題は、テキストが一見難しいということです。その情報をデジタルで表現するアプローチは、単純なものではありません。 ‘日付が難しい、カレンダーが難しい、時間が難しい、個人名が難しい、住所が難しいのと同じ理由です。デジタルマシンが人間の文化的構造と交差するときはいつでも、複雑さ噴火します。それは人生の事実です。人間はデジタルロジックでは機能しません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です