web-dev-qa-db-ja.com

UTF-8、UTF-16、およびUTF-32

UTF-8、UTF-16、およびUTF-32の違いは何ですか?

それらはすべてUnicodeを格納し、それぞれが文字を表すために異なるバイト数を使用することを理解しています。一方を選択することに利点はありますか?

437
Joe

UTF-8は(ASCIIのように)すべての文字を8ビットにエンコードするため、ASCII文字がテキストブロック内の大多数の文字を表す場合、UTF-8には利点があります。 ASCII文字のみを含むUTF-8ファイルは、ASCIIファイルと同じエンコーディングを持つという点でも有利です。

UTF-16は、主に1文字あたり2バイトを使用するため、ASCIIが優勢ではない場合に適しています。 UTF-8は、ほとんどの文字でUTF-16がたった2バイトに留まるところで、より高次の文字のために3バイト以上を使い始めます。

UTF-32は4バイトですべての可能な文字をカバーします。これはかなり肥大化します。私はそれを使うことのどんな利点も考えられません。

330
AnthonyWJones

要するに:

  • 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バイトかかります。巨大なメモリを独り占めするが、操作は速い。ほとんど使われません。

長い間、Wikipediaを参照してください。 TF-8TF-16 、および TF-32

290
Adam Rosenfield
  • UTF-8は可変です1から4バイト。

  • UTF-16は可変2または4バイトです。

  • UTF-32は固定されています4バイト。

108
Quassnoi

Unicodeは1つの巨大な文字セットを定義し、すべてのグラフィカルシンボルに1つの一意の整数値を割り当てます(これは非常に単純化されており、実際には当てはまりませんが、この質問の目的には十分近い)。 UTF-8/16/32はこれをエンコードするための単なる異なる方法です。

簡単に言うと、UTF-32は各文字に32ビット値を使用します。これにより、すべての文字に固定幅のコードを使用することができます。

UTF-16はデフォルトで16ビットを使用します、しかしそれはあなたに65kの可能な文字を与えるだけです、そしてそれは完全なUnicodeセットのために十分にどこにも近くありません。そのため、一部の文字は16ビット値のペアを使用します。

UTF-8はデフォルトで8ビット値を使用します。つまり、最初の127個の値は固定幅のシングルバイト文字です(最上位ビットはこれがマルチバイトシーケンスの始まりであることを示すために使用されます。実際の文字値のビット数他のすべての文字は、最大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は内部的にUTF-16を使用しているので、Windows上ではそれが明らかな選択です。

Linuxは少し異なりますが、彼らは一般的にUnicodeに準拠しているすべてのもののためにUTF-8を使用します。

短い答え:3つのエンコーディングはすべて同じ文字セットをエンコードできますが、各文字を異なるバイトシーケンスとして表します。

74
jalf

Unicodeは標準であり、UTF-xについて考えることができますいくつかの実用的な目的のための技術的な実装

  • TF-8 - "サイズ最適化":ラテン文字ベースのデータ(またはASCII)に最適で、1文字あたり1バイトしかかかりませんが、サイズはそれに応じてシンボルの種類が増えます(そして最悪の場合、1文字あたり6バイトまで成長する可能性があります。
  • TF-16 - "balance":1文字あたり最小2バイトで、既存の主流言語のセットではサイズが固定されているので、文字の取り扱いが簡単です((しかしサイズはまだ可変であり、1文字あたり最大4バイトまで成長する可能性があります。
  • TF-32 - "performance":固定サイズ文字(4バイト)の結果として単純なアルゴリズムを使用できますが、メモリが不利になります。
40
rook

私は blogpost で簡単な説明をしてみました。

UTF-32

エンコードに32ビット(4バイト)が必要--- any文字。たとえば、このスキームを使用して "A"文字のコードポイントを表すには、32ビットの2進数で65を書く必要があります。

00000000 00000000 00000000 01000001 (Big Endian)

詳しく見てみると、ASCIIスキームを使用した場合、右端の7ビットが実際には同じビットであることがわかります。しかし、UTF-32は固定幅スキームなので、さらに3バイト追加する必要があります。つまり、 "A"文字のみを含む2つのファイルがあり、一方がASCIIエンコード、もう一方がUTF-32エンコードである場合、それらのサイズはそれに対応して1バイトと4バイトになります。

UTF-16

UTF-32はコードポイントを表すために固定幅32ビットを使用するので、多くの人は、UTF-16は固定幅16ビットであると考えます。違う!

UTF-16では、コードポイントは16ビット(OR 32ビット)で表現されます。したがって、この方式は可変長符号化方式です。 UTF-32を超える利点は何ですか?少なくともASCIIの場合、ファイルサイズはオリジナルの4倍(ただし2倍)にはならないので、ASCII下位互換性はまだありません。

"A"文字を表すには7ビットで十分なので、UTF-32のように4バイトではなく2バイトを使用できます。それは次のようになります。

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

表現とその解釈方法を理解するためには、元の記事にアクセスしてください。

20
Maroun

UTF-8

  • バイト順の概念がない
  • 1文字あたり1〜4バイトを使用
  • ASCIIはエンコーディングの互換性のあるサブセットです
  • 完全に自己同期します。ストリーム内の任意の場所からドロップされたバイトは、最大で1文字破壊する
  • ほとんどすべてのヨーロッパ言語は1文字あたり2バイト以下でエンコードされています

UTF-16

  • 既知のバイト順で解析するか、バイトオーダーマーク(BOM)を読み取る必要があります。
  • 1文字あたり2バイトまたは4バイトを使用

UTF-32

  • すべての文字は4バイトです
  • 既知のバイト順で解析するか、バイトオーダーマーク(BOM)を読み取る必要があります。

UTF-8は、大部分の文字がCJK(中国語、日本語、および韓国語)文字スペースからのものでない限り、最もスペース効率が高くなります。

UTF-32はバイト配列への文字オフセットによるランダムアクセスに最適です。

18
Jeff Adamson

私はMySQLのデータベースパフォーマンスをUTF-8とUTF-16の間で比較するためにいくつかのテストを行いました。

更新スピード

UTF-8

Enter image description here

UTF-16

Enter image description here

挿入速度

Enter image description here

Enter image description here

速度を削除

Enter image description here

Enter image description here

13
Farid Movsumov

UTF-32では、すべての文字が32ビットでコーディングされています。利点は、文字列の長さを簡単に計算できることです。不利な点は、ASCII文字ごとに3バイト余分に無駄になることです。

UTF-8文字は可変長で、ASCII文字は1バイト(8ビット)でコーディングされ、ほとんどの西部特殊文字は2バイトまたは3バイト(たとえば€は3バイト)でコーディングされます。よりエキゾチックな文字は最大4バイトかかることがあります。明らかな欠点は、先験的には文字列の長さを計算できないことです。しかし、UTF-32と比較して、ラテン語(英語)のアルファベットのテキストをコーディングするのにはるかに少ないバイト数で済みます。

UTF-16も可変長です。文字は2バイトまたは4バイトでコード化されています。私は本当にその点がわかりません。可変長であるという欠点がありますが、UTF-8ほどのスペースを節約するという利点はありません。

これら3つのうち、明らかにUTF-8が最も広く普及しています。

11
vartec

開発環境によっては、文字列データ型を内部でどのようにエンコードするかを選択できない場合もあります。

しかし、データを保管したり交換したりするためには、私が選択したものであれば、常にUTF-8を使用します。あなたがたいていASCIIデータを持っているなら、これはあなたに転送するデータの最小量を与えます、それでもまだすべてをエンコードすることができます。 I/Oを最小限に抑えるための最適化は、最新のマシンで実行する方法です。

6
mghie

前述のように、違いは主に基礎となる変数のサイズであり、それぞれの場合でより多くの文字を表現できるように大きくなります。

しかし、フォント、エンコーディング、その他のものはひどく複雑です(不必要ですか?)。そのため、より詳細な情報を入力するには大きなリンクが必要です。

http://www.cs.tut.fi/~jkorpela/chars.html#ascii

すべてを理解することを期待してはいけませんが、後で問題を起こしたくない場合は、できるだけ早く、できるだけ早く学習することをお勧めします(または、他の人に依頼してもらってください)。

ポール.

2
Paul W Homer

つまり、UTF-16またはUTF-32を使用する唯一の理由は、英語以外のスクリプトと古代のスクリプトをそれぞれサポートすることです。

Web /プログラミングの目的で明らかに効率的であるのに、なぜ誰かが非UTF-8エンコーディングを選択するのだろうか。

一般的な誤解 - 接尾辞の数字はその機能を示すものではありません。 UTF-8がASCIIを1バイトで扱うことができるのと同じように、それらはすべて完全なUnicodeをサポートしているので、CPUおよびインターネットを介したMOREの効率の向上/破損の防止になります。

いくつかの良い読書: http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.html and http://utf8everywhere.org =

0
killjoy