ウィキペディアのUTF-8ページによると、私は人々から相反する意見を聞きました。
彼らは同じものですよね?誰かが明確にできますか?
ウィキペディアのUTF-8ページによると、私は人々から相反する意見を聞きました。
彼らは同じものですよね?誰かが明確にできますか?
回答:
他の人が与えた答えを拡張するには:
コンピューターが理想的に表示する必要がある多くの文字を含む多くの言語があります。Unicodeは、各文字に一意の番号またはコードポイントを割り当てます。
コンピューターはバイトなどの数値を扱います...ここでは少しの履歴をスキップして、メモリアドレス指定の問題を無視します。8ビットコンピューターは、8ビットバイトをハードウェアで簡単に表現できる最大の数値単位として扱い、16ビットコンピューターは拡張します。それを2バイトにします。
ASCIIなどの古い文字エンコーディングは(以前の)8ビット時代のものであり、当時のコンピューティングの主要言語、つまり英語を0〜127(7ビット)の範囲の数値に詰め込もうとします。アルファベットの26文字は、大文字と非大文字の両方の形式で、数字と句読点記号で、かなりうまくいきました。ASCIIは、英語以外の他の言語用に8番目のビットによって拡張されましたが、この拡張によって利用可能になる追加の128の数値/コードポイントは、表示されている言語に応じて異なる文字にマップされます。ISO-8859標準は、このマッピングの最も一般的な形式です。ISO-8859-1およびISO-8859-15(ISO-Latin-1、latin1とも呼ばれ、8859 ISO標準には2つの異なるバージョンがあります)。
ただし、複数の言語の文字を表現する場合は、これだけでは不十分なので、使用可能なすべての文字を1バイトに詰め込むだけでは機能しません。
エンコーディングには基本的に2つの異なるタイプがあります。1つはビットを追加することで値の範囲を拡張します。これらのエンコードの例は、UCS2(2バイト= 16ビット)およびUCS4(4バイト= 32ビット)です。制限が大幅に高くても、値の範囲がまだ制限されているため、ASCIIおよびISO-8859標準と本質的に同じ問題が発生します。
もう1つのタイプのエンコーディングは、文字ごとに可変バイト数を使用します。これについて最も一般的に知られているエンコーディングは、UTFエンコーディングです。すべてのUTFエンコーディングはほぼ同じ方法で機能します。UTF-8の場合は8ビット、UTF-16の場合は16ビット、UTF-32の場合は32ビットのユニットサイズを選択します。次に、標準はこれらのビットのいくつかをフラグとして定義します。これらが設定されている場合、一連のユニットの次のユニットは同じ文字の一部と見なされます。設定されていない場合、この単位は1文字を完全に表します。したがって、最も一般的な(英語)文字は、UTF-8では1バイト(UTF-16では2バイト、UTF-32では4バイト)しか使用しませんが、他の言語文字は6バイト以上を使用できます。
マルチバイトエンコーディング(上記の説明の後でマルチユニットと言います)には、比較的スペース効率が良いという利点がありますが、部分文字列の検索や比較などの操作はすべて、文字をUnicodeコードにデコードする必要があるという欠点があります。そのような操作を実行する前のポイント(ただし、いくつかのショートカットがあります)。
UCS標準とUTF標準はどちらも、Unicodeで定義されているコードポイントをエンコードします。理論的には、これらのエンコードを使用して(エンコードがサポートする範囲内で)任意の数をエンコードできますが、もちろんこれらのエンコードはUnicodeコードポイントをエンコードするために作成されました。そして、それは彼らの間のあなたの関係です。
Windowsはいわゆる「Unicode」文字列をUTF-16文字列として処理しますが、最近のほとんどのUNIXではデフォルトでUTF-8になっています。HTTPなどの通信プロトコルは、UTF-8でのユニットサイズがASCIIと同じであり、そのようなプロトコルのほとんどがASCII時代に設計されているため、UTF-8で最もよく機能する傾向があります。一方、UTF-16は、すべての生きた言語を表すときに、最高の平均スペース/処理パフォーマンスを提供します。
Unicode標準では、32ビットで表現できるよりも少ないコードポイントが定義されています。したがって、UTF-32でマルチユニット文字を処理する必要がほとんどないため、すべての実用的な目的で、UTF-32とUCS4は同じエンコーディングになりました。
いくつかの詳細を記入してください。
0x04000000
toから0x7FFFFFFF
、またはバイナリで文字スペースが存在することを示し1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv
ます-それは実際に6バイトです。ただし、6バイトが最大であり、記事で「6バイト以上」と紛らわしく主張しているわけではありません。
例を使用して、このトピックを説明します。
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
これまでに魔法のようなものは何もありません、それは非常に簡単です。ここで、この文字をハードドライブに保存するとします。そのためには、バイナリ形式で文字を格納する必要があります。'01101100 01001001'をそのまま保存できます。できた!
しかし、ちょっと待ってください、「01101100 01001001」は1文字ですか、それとも2文字ですか。私が言ったので、あなたはこれが1つの文字であることを知っていましたが、コンピュータがそれを読んだとき、それは全くわかりません。したがって、コンピュータにそれを1つとして扱うように指示するために、ある種の「エンコーディング」が必要です。
これが「UTF-8」のルールの出番です:http : //www.fileformat.info/info/unicode/utf8.htm
Binary format of bytes in sequence
1st Byte 2nd Byte 3rd Byte 4th Byte Number of Free Bits Maximum Expressible Unicode Value
0xxxxxxx 7 007F hex (127)
110xxxxx 10xxxxxx (5+6)=11 07FF hex (2047)
1110xxxx 10xxxxxx 10xxxxxx (4+6+6)=16 FFFF hex (65535)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (3+6+6+6)=21 10FFFF hex (1,114,111)
上記の表によると、この文字を「UTF-8」形式を使用して格納する場合は、文字の前に「ヘッダー」を付ける必要があります。私たちの漢字は16ビット長(バイナリ値を自分で数える)なので、十分なスペースを提供するため、行3のフォーマットを使用します。
Header Place holder Fill in our Binary Result
1110 xxxx 0110 11100110
10 xxxxxx 110001 10110001
10 xxxxxx 001001 10001001
結果を1行で書き出す:
11100110 10110001 10001001
これは漢字のUTF-8(バイナリ)値です!(自分で確認してください:http : //www.fileformat.info/info/unicode/char/6c49/index.htm)
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
embed 6C49 as UTF-8: 11100110 10110001 10001001
PSこのトピックをPythonで学習したい場合は、ここをクリックしてください
0
、文字は1バイト(現在のバイト)で110
表され、バイトが始まる場合、文字は2バイト(現在のバイトと次のバイト)で表されます10
))の後の残りのビット、バイトがで始まる場合1110
、文字は3バイト、現在のバイトと次の2バイト(の後の残りのビット10
)で表されます。
"Unicode"は、残念ながら、状況に応じてさまざまな方法で使用されます。その最も適切な使用法(IMO)は、コード化された文字セット -つまり、文字のセットと、文字とそれらを表す整数コードポイント間のマッピングとしてです。
UTF-8は文字エンコーディングです。バイトシーケンスから文字シーケンスに、またはその逆に変換する方法です。Unicode文字セット全体をカバーしています。ASCIIは文字ごとに1バイトとしてエンコードされ、他の文字は正確なコードポイントに応じてより多くのバイトを必要とします(現在定義されているすべてのコードポイントで最大4バイト、つまり最大U-0010FFFF。実際、4バイトは最大U-001FFFFF)。
"Unicode"が文字エンコードの名前として使用される場合(.NET Encoding.Unicodeプロパティなど)、通常はUTF-16を意味し、最も一般的な文字を2バイトとしてエンコードします。一部のプラットフォーム(特に.NETおよびJava)は、「ネイティブ」文字エンコーディングとしてUTF-16を使用します。これは、単一のUTF-16値でエンコードできない文字(「サロゲートペア」としてエンコードされる)を心配する必要がある場合、厄介な問題につながりますが、ほとんどの開発者はこれについて心配することはありません(IME)。
Unicodeに関する参考資料:
それらは同じものではありません-UTF-8はUnicodeをエンコードする特定の方法です。
アプリケーションや使用するデータに応じて、さまざまなエンコーディングを選択できます。私が知る限り、最も一般的なのはUTF-8、UTF-16、UTF-32です。
Unicodeは、コードポイント、つまり文字を表す数値のみを定義します。これらのコードポイントをメモリに格納する方法は、使用しているエンコーディングによって異なります。UTF-8は、Unicode文字をエンコードする方法の1つです。
Unicodeは、ISO / IEC 10646とともに、ほとんどすべての既知の言語を表すために必要な既存のすべての文字のスーパーセットであるUniversal Character Set(UCS)を定義する標準です。
Unicode は、レパートリー内の各文字に名前と番号(Character Code、またはCode-Point)を割り当てます。
UTF-8エンコーディングは、これらの文字をコンピューターのメモリでデジタル的に表現する方法です。UTF-8は各コードポイントを一連のオクテット(8ビットバイト)にマップします
たとえば、
UCS文字= Unicode漢字
UCSコードポイント= U + 24B62
UTF-8エンコーディング= F0 A4 AD A2(16進数)= 11110000 10100100 10101101 10100010(ビン)
http://www.wikiwand.com/en/UTF-8#/Description
最初の行を見てください。
Unicodeは、この文字セットをエンコードするための文字セット(UCS)およびエンコーディング(UTF)を定義する単なる標準です。ただし、一般に、Unicodeは文字セットを指し、標準ではありません。
すべてのソフトウェア開発者の絶対最小値を絶対に読んでください。5分でUnicodeと文字セット(言い訳なし!)とUnicode について確実に知っておく必要があります。
既存の回答はすでに多くの詳細を説明していますが、ここでは最も直接的な説明と例を含む非常に短い回答を示します。
Unicodeは、文字をコードポイントにマッピングする標準です。
各文字には、9731のような番号である一意のコードポイント(識別番号)があります。
UTF-8はコードポイントの エンコーディングです。
すべての文字をディスク(ファイル)に格納するために、UTF-8は文字を最大4オクテット(8ビットシーケンス)-バイトに分割します。UTF-8は、いくつかのエンコーディング(データを表す方法)の1つです。たとえば、Unicodeでは、(10進数の)コードポイント9731は雪だるま(☃
)を表し、UTF-8では3バイトで構成されています。E2 98 83
「$、&、h、a、t、?、张、1、=、+ ...」のように、世界中にたくさんの文字があります。
次に、これらのキャラクターに特化した組織があります、
彼らは「Unicode」と呼ばれる標準を作りました。
標準は次のとおりです。
PS:もちろん、ISOと呼ばれる別の組織があります。「ISO 10646」、ほぼ同じです。
上記のように、U + 0024は単なる位置なので、「U + 0024」をコンピューターに「$」の文字として保存することはできません。
エンコード方式が必要です。
次に、UTF-8、UTF-16、UTF-32、UCS-2などのエンコーディング方式があります。
UTF-8では、コードポイント「U + 0024」は00100100にエンコードされます。
00100100は、コンピューターに "$"として保存する値です。
私はGumboの回答のリンクを確認しましたが、それらの一部をここに貼り付けて、Stack Overflowにも存在するようにしました。
「... Unicodeは16ビットのコードであり、各文字は16ビットをとるので、65,536文字が考えられるという誤解がある人もいます。これは実際には正しくありません。これは、Unicodeに関する最も一般的な神話です。 、だからと思っても気にしないで。
実際、Unicodeには文字について異なる考え方があるため、Unicodeの考え方を理解する必要があります。
これまで、文字はディスクまたはメモリに格納できるいくつかのビットにマッピングされると想定してきました。
A-> 0100 0001
Unicodeでは、文字はコードポイントと呼ばれるものにマップされますが、これはまだ理論上の概念です。そのコードポイントがメモリまたはディスク上でどのように表されるかは、まったく別の話です...」
"...すべてのアルファベットのすべてのプラトニック文字には、次のように書かれたユニコードコンソーシアムによってマジックナンバーが割り当てられています。U+ 0639。このマジックナンバーは、コードポイントと呼ばれます。 U + 0639はアラビア語の文字Ainです。英語の文字AはU + 0041 ...になります。 "
「...それでは、文字列があるとしましょう。
こんにちは
これは、Unicodeでは、次の5つのコードポイントに対応します。
U + 0048 U + 0065 U + 006C U + 006C U + 006F。
コードポイントのほんの一部です。数字、本当に。これをメモリに保存する方法や、電子メールメッセージで表す方法については、まだ何も述べていません...」
「...それがエンコーディングの出番です。
2バイトについての神話につながったUnicodeエンコーディングの最も初期のアイデアは、ちょっと、それらの数値をそれぞれ2バイトに格納することです。だから、こんにちはなり、
00 48 00 65 00 6C 00 6C 00 6F
正しい?そんなに早くない!それもできませんでした:
48 00 65 00 6C 00 6C 00 6F 00?...」
UTF-8は、Unicodeテキストの可能なエンコード方式の1つです。
Unicodeは、130,000を超える文字を定義し、それぞれに数値コード(コードポイント)を割り当てる、広い範囲の標準です。また、このテキストの並べ替え、正規化、大文字と小文字の変更などのルールも定義しています。Unicodeの文字は、0から0x10FFFFまでのコードポイントで表されますが、一部のコードポイントは予約されており、文字に使用できません。
Unicodeコードポイントの文字列をバイナリストリームにエンコードする方法は複数あります。これらは「エンコーディング」と呼ばれます。最も単純なエンコーディングはUTF-32で、これは単に各コードポイントを32ビット整数として格納し、それぞれの幅は4バイトです。
UTF-8はもう 1つのエンコーディングであり、UTF-32やその他のものよりも多くの利点があるため、事実上の標準になりつつあります。UTF-8は、単一バイト値のシーケンスとしてエンコードします。各コードポイントは、これらのバイト値の可変数を使用できます。ASCII範囲のコードポイントは、ASCIIとの互換性を保つために、そのままエンコードされています。この範囲外のコードポイントは、その範囲に応じて、2、3、または4の可変バイト数を使用します。
UTF-8は、次のプロパティを考慮して設計されています。
ASCII文字はASCIIとまったく同じようにエンコードされるため、ASCII文字列も有効なUTF-8文字列です。
バイナリソート:単純なバイナリソートを使用してUTF-8文字列をソートしても、すべてのコードポイントは数値順にソートされます。
複数バイトを必要とする文字には、ASCII範囲のバイト値が含まれていないため、それらの一部がASCII文字と間違えられないことが保証されます。これはセキュリティ機能でもあります。
UTF-8は簡単に検証でき、バリデーターによって他の文字エンコーディングと区別できます。他の8ビットまたはマルチバイトエンコーディングのテキストがUTF-8として検証されることはほとんどありません。
ランダムアクセス:UTF-8文字列の任意の時点で、その位置のバイトが文字の最初のバイトであるかどうかを判断し、前方にスキャンする必要なく、次の文字または現在の文字の先頭を見つけることができます。または数バイト以上逆方向に、またはストリームの先頭で何かを読み取ります。
彼らは同じものですよね?
いいえ、そうではありません。
あなたが参照したウィキペディアのページの最初の文は、簡潔で簡潔な要約を提供していると思います。
UTF-8は、1〜4個の8ビットバイトを使用して、Unicodeで有効なすべての1,112,064コードポイントをエンコードできる可変幅文字エンコードです。
詳しく説明するには:
Unicodeは、文字から数字へのマップ、いわゆるコードポイント(以下の例のように)を定義する標準です。完全なマッピングについては、こちらをご覧ください。
! -> U+0021 (21),
" -> U+0022 (22),
\# -> U+0023 (23)
UTF-8は、コンピューターが理解できる形式(別名ビット)でこれらのコードポイントをエンコードする方法の1つです。言い換えると、これらのコードポイントのそれぞれを一連のビットに変換するか、一連のビットを同等のコードポイントに変換する方法/アルゴリズムです。Unicodeには多くの代替エンコーディングがあることに注意してください。
この記事はすべての詳細を説明します http://kunststube.net/encoding/
バッファへの書き込み
4バイトのバッファ、あ
UTF8エンコーディングのシンボルに書き込むと、バイナリは次のようになります。
00000000 11100011 10000001 10000010
4バイトのバッファ、あ
UTF16エンコーディングのシンボルに書き込むと、バイナリは次のようになります。
00000000 00000000 00110000 01000010
ご覧のとおり、コンテンツで使用する言語に応じて、これはそれに応じてメモリに影響します。
たとえば、この特定のシンボルの場合:あ
次のシンボルに使用する2つの予備のバイトがあるため、UTF16エンコーディングはより効率的です。ただし、日本のアルファベットにUTF16を使用する必要があるという意味ではありません。
バッファーからの読み取り
上記のバイトを読み取る場合は、書き込まれたエンコーディングを確認し、正しくデコードする必要があります。
たとえば、これを00000000 11100011 10000001 10000010
をUTF16エンコーディングにデコード
すると、最終的に臣
はあ
注:エンコードとUnicodeは2つの異なるものです。Unicodeは大きな(テーブル)であり、各シンボルは一意のコードポイントにマッピングされています。たとえば、あ
シンボル(文字)には(コードポイント):30 42(16進数)があります。一方、エンコーディングは、ハードウェアに保存するときに、シンボルをより適切な方法に変換するアルゴリズムです。
30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.
30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.