UTF-8とUnicodeの違いは何ですか?


504

ウィキペディアのUTF-8ページによると、私は人々から相反する意見を聞きました。

彼らは同じものですよね?誰かが明確にできますか?


1
このWIKIがユニコードとUTFについて書いていることは、私の意見では大丈夫です。「UTF-8(またはその他のマルチバイトエンコーディング)では、文字の途中で文字列を分割または切り捨てることが可能で、無効な文字列になる可能性があります。」つまり、UTF-8エンコードされた文字列は、文字列ではなく、バイト配列またはバイトストリームです。文字列を構成する文字はエンコードされます。もちろん、デコードすることもできます。もちろん、スタートバイトの後または次のバイトの後にutf-8シーケンスをカットすることができますが、なぜこれを行う必要があるのですか?
ブライトイ2014年

文字列データ型に関するこの記事は参考になります:mortoray.com/2013/11/27/the-string-type-is-broken- 文字列とそのバイトレベルコンポーネントを操作するときに、誤って文字を半分にチョップすることがあります。
エベレット

回答:


495

他の人が与えた答えを拡張するには:

コンピューターが理想的に表示する必要がある多くの文字を含む多くの言語があります。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は同じエンコーディングになりました。

いくつかの詳細を記入してください。


9
概念的には、UCS-2とUCS-4は文字セットであり、文字エンコードでありません(したがって、名前です)。
メカニカルカタツムリ

74
@Tuukkaこの投稿のエラーは軍団です。ISO 8859のバージョンは2つ以上あります。ASCIIは英語では機能せず、中かっこ、セント記号、アクセントなど、さまざまな機能がありません。Unicodeは英語以外のものだけではありません。英語も必要です!! ANYエンコーディングでコードポイントが4バイトを超えることはありません。この6バイトのビジネスは完全に間違っています。これが言うように、Unicodeスカラー値をUTFエンコードすることはできません:サロゲート&66の他の非文字はすべて禁止されています。UCS-4とUTF-32は同じではありません。マルチユニットUTF-32はありません。UTF-16は、ふりをするほど効率的ではありません—&c&c&c!
tchrist

1
ASCIIにはポンド記号£も含まれていません。もちろん、ユーロ記号€も含まれていません(ASCIIよりかなり新しい)。
TRiG '18年

1
@tchrist結局6バイトありそうないように見えます。これを参照してください:joelonsoftware.com/articles/Unicode.htmlこれは、0x04000000toから0x7FFFFFFF、またはバイナリで文字スペースが存在することを示し1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv ます-それは実際に6バイトです。ただし、6バイトが最大であり、記事で「6バイト以上」と紛らわしく主張しているわけではありません。
構文エラー

12
@syntaxerror:「2、3、実際には最大6バイトを使用して、128以上のコードポイントのみが保存されます。」書かれたときは正確でしたが、同じ年の後半(12年前)には無効になりました。 en.wikipedia.org/wiki/UTF-8は、「元の仕様は31ビット(ユニバーサル文字セットの元の制限)までの数をカバーしていました。2003年11月、UTF-8はRFC 3629によってU +で終わるように制限されましたUTF-16文字エンコーディングの制約に合わせるために10FFFF。これにより、5バイトと6バイトのシーケンスがすべて削除され、4バイトのシーケンスの約半分が削除されました。」
Mooing Duck 2015

237

例を使用して、このトピックを説明します。

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で学習したい場合は、ここをクリックしてください


6
「でもちょっと待ってください、 '01101100 01001001'は1文字か2文字ですか?これは私が言ったので1文字だと知っていましたが、コンピューターがそれを読んだとき、それはわかりません。コンピュータにそれを1つとして扱うように伝えてください。」わかりましたが、コンピューターはまだutf-8でエンコードする必要があることを認識していませんか?
Koray Tugay

15
@KorayTugayコンピュータは、使用するエンコーディングがわかりません。文字をファイルに保存するとき、およびファイルから文字を読み取るときも、それを通知する必要があります。
チェン

3
@Connorコンピュータは使用するフォーマットを認識していません。ドキュメントを保存するとき、テキストエディタはエンコードを明示的にutf-8またはユーザーが使用したい形式に設定する必要があります。また、テキストエディタープログラムがファイルを読み取る場合、正しくデコードするには、テキストエンコード方式を選択する必要があります。文字を入力および入力する場合も同様です。テキストエディターは、正しく保存するために、使用するスキームを知る必要があります。
チェン

2
では、これらのヘッダーはどのように解釈されますか?最初のテーブルを見ると、私は思います:バイトがビットで始まる場合0、文字は1バイト(現在のバイト)で110表され、バイトが始まる場合、文字は2バイト(現在のバイトと次のバイト)で表されます10))の後の残りのビット、バイトがで始まる場合1110、文字は3バイト、現在のバイトと次の2バイト(の後の残りのビット10)で表されます。
JBoy

2
UTF-8に関する10件の記事を読んでください。これを読んだ後、私は10秒以内に理解しました:)
jrhee17 2018年

201

"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に関する参考資料:


16
Windowsプラットフォームでは、UTF-16は「Unicode」にのみ等しいと思います。* nixでは、デフォルトでUTF-8を使用する傾向があります。+1しかし、良い答え
jalf

10
@クリス:いいえ、ISO-8859-1がありません UTF-8。UTF-8は、U + 0080からU + 00FFを1バイトではなく2バイトとしてエンコードします。Windows 1252とISO-8859-1はほとんど同じですが、私が正しく覚えていれば、値0x80と0x99の間で異なります。ISO8859-1には「穴」がありますが、CP1252は文字を定義します。
ジョンスキート

13
UTF-16を "Unicode"と呼ぶという考えは、混乱する可能性があるため、私にとっては簡単ではありません。これは、.NETの規則としてのみ明確に指摘されていたとしてもです。UTF-16はUnicodeを表す方法ですが、「Unicodeエンコーディング」ではありません。
thomasrutter 2009年

6
@unwesen:UTF-8はサロゲートペアを必要としません。徐々に長いバイトシーケンスを使用して非BMP文字を表すだけです。
Jon Skeet、

5
@RoyiNamir:はい、残念ながら「Unicode」は、特にWindowsでは「UTF-16」を意味するためによく使用されます。
Jon Skeet 2013

108

それらは同じものではありません-UTF-8はUnicodeをエンコードする特定の方法です。

アプリケーションや使用するデータに応じて、さまざまなエンコーディングを選択できます。私が知る限り、最も一般的なのはUTF-8、UTF-16、UTF-32です。


10
ただし、要点は、一部の編集者はファイルを「Unicode」または「UTF-8」として保存することを提案しているということです。したがって、この場合の「Unicode」についての言及はUTF-16である必要があると私は信じています。
serhio 2010

71

Unicodeは、コードポイント、つまり文字を表す数値のみを定義します。これらのコードポイントをメモリに格納する方法は、使用しているエンコーディングによって異なります。UTF-8は、Unicode文字をエンコードする方法の1つです。


2
ただし、要点は、一部の編集者はファイルを「Unicode」または「UTF-8」として保存することを提案しているということです。したがって、この場合の「Unicode」についての言及はUTF-16である必要があると私は信じています。
serhio 2010

文字を表す数字もASCIIを実行します。
brighty

6
このページの残りの回答を見る前と後に読んでください
Dodgie

33

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(ビン)


いいえ、UTF-8はコードポイントのみを127より大きいシーケンスにマップします。0から127まではすべてシーケンスではなく1バイトです。ところで、ASCIIは数字にも文字の名前を割り当てます。そのため、これはUnicodeと同じです。しかし、Unicodeはコードポイント127で止まらず、0x10ffffまで上がります。
brighty '06 / 06/14

2
@明るく違う。ASCII文字は、実際には1バイトシーケンスにマッピングされます。アスキー文字のコードの場合は0である最初のビットは、続くバイト数を示します-ゼロ。http://www.wikiwand.com/en/UTF-8#/Description最初の行を見てください。
ナイトリートレイル2014年

私にとっては、シーケンスは複数のバイトで構成されています。UTF-8内のASCII文字は、1バイトのままで、最上位ビットが0に設定されています。127を超えるコードポイントには、シーケンスが必要です。このシーケンスには、常に開始バイトと1、2、または3バイトが続きます。では、なぜ1バイトを「シーケンス」と呼ぶのでしょうか。
brighty 2014年

まあ...多くの場合、英語の弁護士は、ソフトウェアの意図的な誤用に困惑することがあります。ここでも同じです。あなたはそれについて議論することができます。しかし、それによってそれが明確になることはありません。
ナイトリートレイル2014年

1
@brightyうーん、数学では、0要素のシーケンスは OKです。ここでも1要素のシーケンスで問題ありません。
chux-モニカを2017年

24

Unicodeは、この文字セットをエンコードするための文字セット(UCS)およびエンコーディング(UTF)を定義する単なる標準です。ただし、一般に、Unicodeは文字セットを指し、標準ではありません。

すべてのソフトウェア開発者の絶対最小値を絶対に読んでください。5分でUnicodeと文字セット(言い訳なし!)Unicode について確実に知っておく必要があります。


1
@serhio:わかっています。3つの異なるUTF-16エンコーディングがあります。2つの明示的なUTF-16LEUTF-16BE、およびエンディアンがBOMで指定されている暗黙のUTF-16
ガンボ

@ガンボ:BOMがないからといって、エンコードが異なるという意味ではありません。エンコーディングは2つしかありません。
Mooing Duck 2015

上記のブログは、StakcoverflowのCEOが執筆しています。
Shailesh Pratapwar

23

既存の回答はすでに多くの詳細を説明していますが、ここでは最も直接的な説明と例を含む非常に短い回答を示します。

Unicodeは、文字をコードポイントにマッピングする標準です。
各文字には、9731のような番号である一意のコードポイント(識別番号)があります。

UTF-8はコードポイント エンコーディングです。
すべての文字をディスク(ファイル)に格納するために、UTF-8は文字を最大4オクテット(8ビットシーケンス)-バイトに分割します。UTF-8は、いくつかのエンコーディング(データを表す方法)の1つです。たとえば、Unicodeでは、(10進数の)コードポイント9731は雪だるま()を表し、UTF-8では3バイトで構成されています。E2 98 83

これは、ランダムな例をいくつか並べたリストです


1
番号!UTF-8はユニコード文字をエンコードするための優れた方法ですが、UTF-16またはUTF-32でもエンコードできます。UTF-32では、DWORDとコードポイントの間に1:1の関係があり、UTF-16では、サロゲートとBOMを除いて、BMPのコードポイントについてのみ、WORDとコードポイントの間に1:1の関係があります。ちょうどコードポイントのバイトとコードポイントとの1関係<127:UTF-8では、1持っている
brighty

5
@明るい:でも、なぜ「いや!」私は「UTF-8には、いくつかのエンコーディングの一つである」書いたので、 UTF-16とUTF-32もあります。
basic6

16

1. Unicode

「$、&、h、a、t、?、张、1、=、+ ...」のように、世界中にたくさんの文字があります。

次に、これらのキャラクターに特化した組織があります、

彼らは「Unicode」と呼ばれる標準を作りました。

標準は次のとおりです。

  • 各位置が「コードポイント」または「コード位置」と呼ばれるフォームを作成します。
  • 全体の位置はU + 0000からU + 10FFFFです。
  • これまでは、一部の位置は文字で埋められ、他の位置は保存されるか空になります。
  • たとえば、位置「U + 0024」は文字「$」で埋められます。

PS:もちろん、ISOと呼ばれる別の組織があります。「ISO 10646」、ほぼ同じです。

2. UTF-8

上記のように、U + 0024は単なる位置なので、「U + 0024」をコンピューターに「$」の文字として保存することはできません。

エンコード方式が必要です。

次に、UTF-8、UTF-16、UTF-32、UCS-2などのエンコーディング方式があります。

UTF-8では、コードポイント「U + 0024」は00100100にエンコードされます。

00100100は、コンピューターに "$"として保存する値です。


1
一般的に、UTF-8は今日誰もが使用する唯一のバリアントです。
リックジェームズ

2
ISO 10646は、Unicode文字セットと同じ規格です。Unicodeは、並べ替えや大文字小文字の区別など、文字セット以外にも多くのことを定義しています。ISO10646は単なる文字セットです(現在、130,000以上あります)。UnicodeコンソーシアムとISOはUnicodeを共同で開発しています。ISOは文字セットとそのエンコーディングのみに関係し、Unicodeは文字のプロパティとテキスト処理のルールも定義しています。
thomasrutter 2017

12

私は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?...」


ASCIIでは、文字はUnicodeだけでなくコードポイントにもマッピングされます。
ブライトイ2014年

8

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文字列の任意の時点で、その位置のバイトが文字の最初のバイトであるかどうかを判断し、前方にスキャンする必要なく、次の文字または現在の文字の先頭を見つけることができます。または数バイト以上逆方向に、またはストリームの先頭で何かを読み取ります。


マイナーなポイントのカップル:[1]はべきではない「彼らがしているようASCII文字を正確にエンコードされたASCIIに変更され 、「彼らはしているとおりにエンコードされたASCII文字UTF-8?[2] 「Unicodeのコード...」というフレーズは(私にとって)不明確です。あなたが意味するか、「Unicodeコードポイントを...」
skomisa

ポイント1の@skomisaは、ASCII範囲内の文字のエンコードがASCIIとUTF-8で同じであることを意味しました。
thomasrutter

ポイント2については、それは公平なポイントです。わかり
やすく

2

彼らは同じものですよね?

いいえ、そうではありません。


あなたが参照したウィキペディアのページの最初の文は、簡潔で簡潔な要約を提供していると思います。

UTF-8は、1〜4個の8ビットバイトを使用して、Unicodeで有効なすべての1,112,064コードポイントをエンコードできる可変幅文字エンコードです。

詳しく説明するには:

  • Unicodeは、文字から数字へのマップ、いわゆるコードポイント(以下の例のように)を定義する標準です。完全なマッピングについては、こちらをご覧ください

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8は、コンピューターが理解できる形式(別名ビット)でこれらのコードポイントをエンコードする方法の1つです。言い換えると、これらのコードポイントのそれぞれを一連のビットに変換するか、一連のビットを同等のコードポイントに変換する方法/アルゴリズムです。Unicodeには多くの代替エンコーディングがあることに注意してください。


ジョエルは本当に素晴らしい説明と歴史の概要をここに与えます


2

このスレッドから集めたものを要約すると:

Unicodeは文字を序数(10進形式」)に「変換」します。

à = 224

UTF-8は、これらの数値をバイナリ表現に「変換」するエンコーディングです。

224 = 11000011 10100000

ここでは、224 のバイナリ表現であることに注意してください。バイナリ形式である0b11100000ではありません。


2

この記事はすべての詳細を説明します 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.

ここに画像の説明を入力してください


リンク先の記事は非常に良い、うまくいけば、それはアクティブのまま続け
yolob 21

0

UTF-8は、8ビットシーケンスを使用してUnicode文字をエンコードする方法です。

Unicodeは、多くの言語のさまざまな文字を表すための標準です。


4
「8ビットシーケンス」…?より正確にそれを指定したいと思うかもしれません…
deceze
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.