UTF8 vs. UTF16 vs. char * vs.何?誰かが私にこの混乱を説明します!
-
05-07-2019 - |
質問
このマルチバイト文字のすべてをほとんど無視することができましたが、UIの作業を行う必要があり、この領域での私の無知が追いついてくることを知っています!アプリケーションをローカライズするために知っておく必要があることを、だれでも数段落以内で説明できますか?どのタイプを使用する必要があります(.NetとC / C ++の両方を使用し、UnixとWindowsの両方でこの回答が必要です)。
解決
Joel Spolskyの Unicodeについて絶対に、積極的に知っておく必要のある絶対的な最小要件および文字セット(言い訳なし!)
EDIT 20140523 :また、 キャラクター、シンボル、 YouTubeのトムスコットによるUnicode奇跡 -10分足らずで、UTF-8である素晴らしい「ハック」の素晴らしい説明
他のヒント
文字エンコーディングは、それぞれが特定の文字セットからシンボルを検索する一連のコードで構成されます。 文字エンコードに関するウィキペディアのこちらの良い記事をご覧ください。
UTF8(UCS) は1〜4バイトを使用します各シンボルに対して。 ウィキペディアは、マルチバイトのランダウンがどのように機能するかについての適切な要約を示しています。
- シングルバイト文字の最上位ビットは常に0です。
- マルチバイトシーケンスの最初のバイトの最上位ビット シーケンスの長さを決定します。 これらの最上位ビットは110です 2バイトシーケンスの場合。 1110 3バイトのシーケンスなど。
- マルチバイトシーケンスの残りのバイトには、2つの最も多い10があります。 有効ビット。
- UTF-8ストリームには、バイトFEもFFも含まれていません。これにより、 UTF-8ストリームはUTF-16のようには見えません U + FEFFで始まるストリーム (バイトオーダーマーク)
このページには、各文字エンコーディングタイプの長所と短所の大きな比較も示されています。
各シンボルに2バイトから4バイトを使用します。
各シンボルに常に4バイトを使用します。
char は単なるデータのバイトを意味し、実際のエンコードではありません。 UTF8 / UTF16 / asciiとは異なります。 char *ポインターは、あらゆるタイプのデータとあらゆるエンコードを参照できます。
STL:
stlのstd :: wstringとstd :: stringの両方は、 UTF-8やUTF-16などの可変長文字エンコーディング。
実装方法:
iconvライブラリをご覧ください。 iconv は、 libxml (GnomeのXML Cパーサー)
文字エンコードに関するその他の優れたリソース:
受け取った知恵は、Spolskyの記事が欠落していることを示唆していますいくつかの重要なポイント。
この記事は、より完全であることが推奨されます。 Unicode®標準:技術的な紹介
この記事も良い紹介です: Unicode Basics
特に後者は、Unicodeの文字エンコード形式とスキームの概要を示しています。
さまざまなUTF標準は、「コードポイント」をエンコードする方法です。コードポイントは、Unicode文字セットへのインデックスです。
別のエンコードは、常に16ビットであるUCS2であり、Unicodeの全範囲をサポートしていません。
知っておくと良いのは、1つのコードポイントが1文字に等しくないことです。たとえば、åなどの文字コードポイントまたはaとリングの2つのコードポイントの両方として表すことができます。
したがって、2つのUnicode文字列を比較するには、比較の前に正規表現を取得するための正規化が必要です。
フォントにも問題があります。フォントを処理するには2つの方法があります。必要なすべてのUnicode文字に巨大なフォントとグリフを使用するか(最近のバージョンのWindowsには1つまたは2つのそのようなフォントが付属していると思います)。または、Unicode標準のサブセット専用のさまざまなフォントのグリフを結合できるsomライブラリを使用します。