UTF-8、UTF-16、およびUTF-32
質問
UTF-8、UTF-16、UTF-32の違いは何ですか?
これらはすべて Unicode を格納し、それぞれが文字を表すために異なるバイト数を使用することを理解しています。どちらかを選択することに利点はありますか?
解決
UTF-8、UTF-8(ASCIIのように)8ビットにすべての文字をエンコードするためのASCII文字は、テキストのブロック内の文字の大部分を表す場合に利点を有します。これは、ASCII文字のみを含むUTF-8ファイルは、ASCIIファイルと同じ符号を有することも有利である。
それは主に、文字ごとに2つのバイトを使用していますので、UTF-16は、ASCIIが支配的でない場合より良いです。 UTF-8は、UTF-16は、ほとんどの文字のためのちょうど2バイトのままで、より高次の文字に3バイト以上を使用することを開始します。
UTF-32は、4バイト単位で可能なすべての文字をカバーします。これはかなり肥大化します。私はそれを使用して任意の利点を考えることはできません。
他のヒント
要するに:
- UTF-8:可変幅エンコーディング、ASCII との下位互換性。ASCII 文字 (U+0000 ~ U+007F) は 1 バイト、コード ポイント U+0080 ~ U+07FF は 2 バイト、コード ポイント U+0800 ~ U+FFFF は 3 バイト、コード ポイント U+10000 ~ U+10FFFF 4バイトかかります。英語のテキストには適していますが、アジアのテキストにはあまり適していません。
- UTF-16:可変幅エンコーディング。コード ポイント U+0000 ~ U+FFFF は 2 バイト、コード ポイント U+10000 ~ U+10FFFF は 4 バイト必要です。英語のテキストには適していませんが、アジアのテキストには適しています。
- UTF-32:固定幅エンコーディング。すべてのコード ポイントは 4 バイトを必要とします。メモリを大量に消費しますが、動作は高速です。ほとんど使われません。
UTF-8は可変です 1~4 バイト。
UTF-16は可変です 2 または 4 バイト。
UTF-32は修正されました 4 バイト。
Unicodeは、すべてのグラフィカルシンボル(つまり、主要な簡素化され、そして実際に真実ではないですが、それはこの質問の目的のために十分に近いです)に1つの一意の整数値を割り当て、単一の巨大な文字セットを定義します。 UTF-8/16/32は単にこれを符号化するための異なる方法があります。
簡単に述べると、UTF-32は、各文字の32ビット値を使用します。それは彼らがすべての文字に固定幅のコードを使用することができます。
UTF-16は、デフォルトでは16ビットを使用していますが、それだけであなたに完全なUnicodeセットのための十分の近くにどこにもない65K可能な文字を与えます。だから、一部の文字は、16ビット値のペアを使用します。
とUTF-8は、127最初の値であることを意味デフォルト、固定幅のシングルバイト文字(最上位ビットが、これはマルチバイトシーケンスの開始であることを意味するために使用されることにより、8ビット値を使用し)実際の文字値の7ビットを残します。他のすべての文字は、(メモリが機能する場合)までの4バイトのシーケンスとして符号化される。
そして、それが利点に私たちをリード。任意のASCII文字は、UTF-8との直接の互換性がありますので、レガシーアプリケーションをアップグレードするため、UTF-8が一般的で当然の選択です。ほとんどの場合、それはまた、少なくともメモリを使用します。一方、あなたは文字の幅についていかなる保証をすることはできません。これは、文字列操作が困難れ、ワイド1、2、3または4文字であってもよい。
UTF-32が反対で、それはほとんどのメモリを(各文字が固定された4バイト幅で)使用していますが、一方で、あなたはのすべての文字は、この正確な長さを持っていることの知っているので、文字列操作がはるかに簡単になります。あなたは、単に文字列のバイト単位の長さから文字列の文字数を計算することができます。あなたはUTF-8でそれを行うことはできません。
UTF-16は妥協です。これは、の最もの文字は固定幅の16ビット値に適合することができます。だから、限り、あなたは中国の記号、音符や他のいくつかを持っていないとして、あなたはそれぞれの文字は16ビット幅であると仮定することができます。これは、UTF-32より少ないメモリを使用しています。しかし、それはいくつかの方法「両方の世界の最悪」です。それはほとんど常にUTF-8よりも多くのメモリを使用し、それはまだUTF-8(可変長文字)を悩ませて問題を回避しません。
最後に、それだけでプラットフォームがサポートしている何で行くと便利です。 Windows上で、それは当然の選択であるように、Windowsは、内部的にUTF-16を使用します。
Linuxは少し異なりますが、それらは一般的にはUnicodeに準拠しているすべてのためにUTF-8を使用します。
だから、短い答えは:すべての3つのエンコーディングが同じ文字セットをエンコードすることができますが、それらは異なるバイト列として各文字を表す
。ユニコード は標準であり、約 UTF-x いくつかの実用的な目的のための技術的な実装として考えることができます。
- UTF-8 - "サイズの最適化":ラテン文字ベースのデータ (または ASCII) に最適で、1 文字あたり 1 バイトしか必要としませんが、シンボルの種類に応じてサイズが増加します (最悪の場合、1 文字あたり最大 6 バイトまで増加する可能性があります)。
- UTF-16 - "バランス":文字あたり最低 2 バイト必要ですが、これは、文字の処理を容易にするために固定サイズになっている主流言語の既存のセットには十分です (ただし、サイズは依然として可変であり、文字あたり最大 4 バイトまで増加する可能性があります)
- UTF-32 - "パフォーマンス":固定サイズの文字 (4 バイト) の結果として単純なアルゴリズムを使用できますが、メモリの欠点があります。
私は<のhref = "http://marounbassam.blogspot.co.il/2016/02/must-know-unicode-and-character-sets.html?spref=twで簡単な説明を与えることを試みました"REL =" noreferrer ">ブログ投稿する。
UTF-32
いずれかの文字をエンコードするために32ビット(4バイト)を必要とします。例えば、このスキームを使用した「A」の文字コード・ポイントを表現するために、あなたは32ビットの2進数で65を記述する必要があります:
00000000 00000000 00000000 01000001 (Big Endian)
あなたがよく見ている場合、、あなたはASCII方式を使用する場合、最も右の7ビットは、実際には同じビットであることに注意しましょう。 UTF-32はの固定幅のスキームのであるから。しかし、私たちは三つの追加バイトを添付する必要があります。我々は唯一の「A」の文字、1はASCIIでエンコードされ、他方がUTF-32エンコードされているが含まれている2つのファイルを持っている場合は、その大きさは、それに対応し、1バイトと4バイトになることを意味します。
UTF-16
多くの人々は、UTF-32コードポイントを表すために、固定幅32ビットを使用するように、UTF-16は16ビット固定幅であると考えます。 WRONG!
UTF-16のコードポイントは、おそらくいずれかの16ビット、または32ビットで表されます。したがって、この方式では、可変長符号化方式です。 UTF-32を超える利点は何ですか?少なくともASCIIのため、ファイルのサイズが4倍(まだ2回)ではありませんので、我々はまだ後方互換ASCIIいない。
7ビットが「A」の文字を表すのに十分であるので、、我々は今、UTF-32のような2バイトの代わりに4を使用することができます。それは次のようになります:
00000000 01000001
UTF-8
は、右推測.. UTF-8のコードポイントは、多分いずれか32、16、24ビットまたは8ビットを用いて表され、UTF-16システムとして、これはまた、可変長符号化方式である。
最後に、我々はASCII符号化システムを使用して、それを表現するのと同じ方法で「A」を表すことができます:
01001101
UTF-16はUTF-8よりも実際に良好である小さな例
中国の手紙を検討する "語" - そのUTF-8エンコーディングがあります:
11101000 10101010 10011110
そのUTF-16エンコーディングは短いですが。
10001010 10011110
表現とそれがどのように解釈されていますを理解するために、オリジナルのポストを訪問します。
UTF-8
- バイトオーダーの概念がない
- 1 文字あたり 1 ~ 4 バイトを使用します
- ASCII は互換性のあるエンコーディングのサブセットです
- 完全に自己同期します。例:ストリーム内の任意の場所からドロップされたバイトによって破損するのは最大でも 1 文字だけです
- ほぼすべてのヨーロッパ言語は 1 文字あたり 2 バイト以下でエンコードされます
UTF-16
- 既知のバイトオーダーで解析するか、バイトオーダーマーク (BOM) を読み取る必要があります。
- 1文字あたり2バイトまたは4バイトを使用します
UTF-32
- すべての文字は 4 バイトです
- 既知のバイトオーダーで解析するか、バイトオーダーマーク (BOM) を読み取る必要があります。
文字の大部分が CJK (中国語、日本語、および韓国語) 文字スペースからのものでない限り、UTF-8 が最もスペース効率が高くなります。
UTF-32 は、バイト配列への文字オフセットによるランダム アクセスに最適です。
私は、MySQLでUTF-8とUTF-16の間でデータベースのパフォーマンスを比較するために、いくつかのテストを行っています。
更新速度
UTF-8
UTF-16
挿入速度
スピードを削除
UTF-32の文字のすべてが32ビットで符号化されます。利点は、あなたが簡単に文字列の長さを計算することができるということです。欠点は、各ASCII文字のためにあなたが余分に3つのバイトを無駄にしていることである。
UTF-8の文字が可変長さを有し、ASCII文字は1バイト(8ビット)で符号化された、最も西洋特殊文字(例えば€は3バイトである)のいずれか2バイトまたは3バイトで符号化され、よりエキゾチックな文字であります4つのバイトまで取ることができます。クリア欠点は、先験的あなたは、文字列の長さを計算することができないということ、です。しかし、それはUTF-32に比べて、ラテン語(英語)アルファベットのテキストをコーディングするはるかに少ないバイトをとります。
UTF-16はまた、可変長です。文字は、2バイトまたは4つのバイトのいずれかで符号化されます。私は実際にポイントが表示されていません。これは、可変長であるという欠点を持っていますが、UTF-8と同じくらいのスペースを節約することの利点を持っていません。
これらの3つのうち、明確にUTF-8が最も広く普及されています。
ご使用の開発環境に応じて、あなたもあなたの文字列データ型をコードする内部的に使用されますどのような選択肢を持っていない可能性があります。
しかし、あなたは選択肢を持っている場合、私は常に、UTF-8使用するデータを格納し、交換するため。あなたは主にASCIIデータを持っている場合、これはまだすべてをエンコードすることができながら、あなたに転送するデータの最小量を与えるだろう。以上のために最適化するとI / Oは、現代のマシンに移動するための方法である。
、違いは主にそれぞれの場合に複数の文字を表現できるように大きくなり、基礎となる変数の大きさです。
ただし、フォントは、エンコードと物事が悪(不必要?)複雑されるので、大きなリンクは、より詳細に記入する必要がある。
http://www.cs.tut.fi/~jkorpela /chars.html#asciiする
それをすべて理解することは期待しないでください、しかし、あなたが問題を持ってしたくない場合は、後でそれは早けれすることができます(または単に他の誰かがあなたのためにそれを整理してき)のように、あなたができる限りを学ぶ価値があります。
ポールます。
要するに、UTF-16またはUTF-32を使用する唯一の理由は、それぞれ非英語と古代のスクリプトをサポートすることです。
私はそれが明らかにウェブ/プログラミングの目的のために、より効率的であるとき、誰もが非UTF-8エンコーディングを持っていることを選んだなぜ疑問に思った。
一般的な誤解 - サフィックス番号は、その能力を示すものではありません。彼らはすべて完全なUnicodeをサポートし、ちょうどそのUTF-8は、単一のバイトでASCIIを扱うことができるので、CPUへと、インターネット上でより少ない堕落/より効率的です。
いくつかの良い読書:のhttp:// WWW。 personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.htmlする そして、 http://utf8everywhere.orgする