ウィキペディアの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 つのタイプのエンコーディングは、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 と同じであるため、UTF-8 で最適に機能する傾向があり、そのようなプロトコルのほとんどは ASCII 時代に設計されました。一方、UTF-16 は、すべての生きている言語を表す場合に、平均的なスペース/処理パフォーマンスが最も優れています。
Unicode 標準では、32 ビットで表現できるよりも少ないコード ポイントが定義されています。したがって、UTF-32 ではマルチユニット文字を処理する必要がほとんどないため、実用的な目的のために、UTF-32 と UCS4 は同じエンコーディングになりました。
いくつかの詳細を記入してください。
このトピックを説明するために例を使用しましょう。
A Chinese character: 汉
its Unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
これまでのところ魔法のようなものは何もなく、とてもシンプルです。ここで、このキャラクターをハード ドライブに保存するとします。そのためには、文字をバイナリ形式で保存する必要があります。「01101100 01001001」として単純に保存できます。終わり!
でもちょっと待って、「01101100 01001001」は1文字なのか2文字なのか?これが 1 文字であることは、私が言ったので知っていましたが、コンピューターがそれを読み取るとき、それはわかりません。そのため、コンピューターにそれを 1 つとして扱うように指示するには、何らかのエンコードが必要です。
これがUTF-8のルールの出番です: https://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 バイナリ値です! 自分の目で確かめてください: https://www.fileformat.info/info/unicode/char/6c49/index.htm
A Chinese character: 汉
its Unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
encode 6C49 as UTF-8: 11100110 10110001 10001001
PS このトピックを Python で学びたい場合は、ここをクリックしてください。
残念ながら、「Unicode」はコンテキストに応じてさまざまな方法で使用されます。その最も正しい使用法(IMO)は、コード化された文字セットとしてです。つまり、文字のセットと、文字とそれらを表す整数コードポイントとの間のマッピングです。
UTF-8は文字エンコードであり、バイトのシーケンスから文字のシーケンスに、またはその逆に変換する方法です。Unicode文字セット全体をカバーしています。ASCIIは文字ごとに1バイトとしてエンコードされ、他の文字は正確なコードポイントに応じてより多くのバイトを取ります(現在定義されているすべてのコードポイントで最大4バイト、つまり最大U-0010FFFF、実際には4バイトで最大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は、実質的にすべての既知の言語を表すために必要な既存のすべての文字のスーパーセットであるUniversal Character Set (UCS)をISO/IEC 10646 と共に定義する標準です。
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 (ビン)
Unicodeは、この文字セットをエンコードするための文字セット ( UCS ) とエンコーディング ( UTF ) を定義する単なる標準です。しかし、一般的に、Unicode は文字セットを参照しており、標準ではありません。
すべてのソフトウェア開発者が5 分で Unicode と文字セット (言い訳はありません!)とUnicodeについて絶対に、積極的に知っておく必要がある絶対的な最小値をお読みください。
「$,&,h,a,t,?,张,1,=,+...」など、世界中にたくさんの文字があります。
その後、これらのキャラクターに専念する組織が登場し、
彼らは「ユニコード」と呼ばれる標準を作りました。
基準は次のようなものです。
PS: もちろん、ISO と呼ばれる別の組織が別の標準を維持しています。「ISO 10646」、ほとんど同じです。
上記のように、U+0024 は単なる位置なので、文字 "$" に対して "U+0024" をコンピューターに保存することはできません。
エンコード方法が必要です。
次に、UTF-8、UTF-16、UTF-32、UCS-2 などのエンコード方法があります。
UTF-8 では、コード ポイント「U+0024」は 00100100 にエンコードされます。
00100100 は、コンピューターに保存する "$" の値です。
このスレッドから収集したことを要約すると、次のようになります。
Unicodeは、文字を序数 (10 進数形式) に割り当てます。(これらの数値はコード ポイントと呼ばれます。)
à -> 224
UTF-8 は、これらの序数 (10 進数形式)を2 進数表現に「変換」するエンコーディングです。
224 -> 11000011 10100000
224 の 2 進数表現について話していることに注意してください。2 進数形式 (0b11100000) ではありません。
ガンボの回答のリンクを確認しましたが、それらの一部をここに貼り付けて、スタック オーバーフローにも存在させたいと思いました。
「...一部の人々は、Unicode は単純に 16 ビット コードであり、各文字が 16 ビットを取り、したがって 65,536 の可能な文字があると誤解しています。これは、実際には正しくありません。これは、Unicode に関する唯一の最も一般的な神話です。と思った方、気を悪くしないでください。
実際、Unicode では文字について異なる考え方があり、Unicode の考え方を理解しなければ意味がありません。
これまで、文字はディスクまたはメモリに保存できるいくつかのビットにマップされると想定してきました。
あ -> 0100 0001
Unicode では、文字はコード ポイントと呼ばれるものにマップされますが、これはまだ理論上の概念にすぎません。そのコード ポイントがメモリまたはディスク上でどのように表現されるかは、まったく別の話です...」
「...すべてのアルファベットのすべてのプラトニック文字には、次のように書かれたUnicodeコンソーシアムによって魔法の番号が割り当てられています:U + 0639。この魔法の番号はコードポイントと呼ばれます。U +は「Unicode」を意味し、数字は16進数です. U+0639 はアラビア文字の Ain です。英語の文字 A は U+0041 になります...."
「...OK、文字列があるとしましょう:
こんにちは
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 ? ...」