web-dev-qa-db-ja.com

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

考慮してください:

Alt text

unicode=utf16は本当ですか?

Unicodeはエンコードではなく標準であると多くの人が言っていますが、ほとんどのエディターはUnicodeとしての保存をサポートしていますエンコード

177
ollydbg

ほとんどの編集者は、実際には「Unicode」エンコーディングとして保存をサポートしています。

これは、Windowsによって実行される残念な名前の誤りです。

WindowsはUTF-16LEエンコードをUnicode文字列のメモリストレージ形式として内部的に使用するため、これはUnicodeテキストの自然なエンコードであると見なされます。 Windowsの世界では、ANSI文字列(現在のマシンのシステムコードページであり、完全に移植性がない)とUnicode文字列(UTF-16LEとして内部に保存されています)があります。

これはすべて、Unicodeの初期に考案されました。UCS-2では不十分であることがわかり、UTF-8が発明される前です。これが、UTF-8に対するWindowsのサポートが万能ではない理由です。

この誤った名前付けスキームは、ユーザーインターフェイスの一部になりました。 Windowsのエンコーディングサポートを使用してさまざまなエンコーディングを提供するテキストエディタは、UTF-16LEを「Unicode」、UTF-16BE(提供されている場合)を「Unicodeビッグエンディアン」として自動的かつ不適切に記述します。

(Notepad ++など、エンコードを独自に行う他のエディターには、この問題はありません。)

気分が良くなる場合、「ANSI」文字列もANSI標準に基づいていません。

157
bobince

Rasmusが彼の記事で述べているように "UTF-8とUnicodeの違いは?" (リンク修正):

「UTF-8とUnicodeの違いは何ですか?」という質問に答えたら、自信を持って短く正確な答えを返してくれますか?国際化の最近では、すべての開発者がそれを行うことができるはずです。私たちの多くはこれらの概念を理解していないはずです。自分がこのグループに属していると思われる場合は、文字セットとエンコーディングに関するこの超短い紹介をお読みください。

実際、UTF-8とUnicodeの比較は、リンゴとオレンジの比較に似ています。

UTF-8はエンコードです-Unicodeは文字セットです

文字セットは、一意の番号を持つ文字のリストです(これらの番号は「コードポイント」と呼ばれることもあります)。たとえば、Unicode文字セットでは、Aの数は41です。

一方、エンコーディングは、数値のリストをバイナリに変換してディスクに保存できるアルゴリズムです。たとえば、UTF-8は次のように番号シーケンス1、2、3、4を変換します。

00000001 00000010 00000011 00000100 

データはバイナリに変換され、ディスクに保存できるようになりました。

すべて一緒に今

アプリケーションがディスクから次の情報を読み取るとします。

1101000 1100101 1101100 1101100 1101111 

アプリは、このデータがUTF-8でエンコードされたUnicode文字列を表していることを認識しており、ユーザーにテキストとして表示する必要があります。最初のステップは、バイナリデータを数値に変換することです。アプリは、UTF-8アルゴリズムを使用してデータをデコードします。この場合、デコーダーはこれを返します:

104 101 108 108 111 

アプリはこれがUnicode文字列であることを知っているため、各数字が文字を表していると想定できます。 Unicode文字セットを使用して、各数字を対応する文字に変換します。結果の文字列は「hello」です。

結論

だから誰かが「UTF-8とUnicodeの違いは何ですか?」と尋ねたとき、あなたは自信を持って短く正確に答えることができます:

UTF-8(Unicode Transformation Format)とUnicodeは比較できません。 UTF-8は、数値をバイナリデータに変換するために使用されるエンコードです。 Unicodeは、文字を数字に変換するために使用される文字セットです。

527
vikas devde

それほど単純ではありません。

UTF-16は16ビットの可変幅エンコーディングです。単に「Unicode」と呼ぶのはあいまいです。「Unicode」とは、文字エンコーディングの標準セット全体を指すからです。 Unicodeはnotエンコーディングです!

http://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Character_Set

そしてもちろん、義務 Joel On Software-すべてのソフトウェア開発者が絶対的かつ積極的にUnicodeおよび文字セットについて絶対に知っておく必要がある(言い訳なし!) リンク。

28
Matt Ball

ここには多くの誤解が表示されています。 Unicodeはanエンコーディングではありませんが、いずれにしてもUnicode標準は主にエンコーディングに専念しています。

ISO 10646は、(おそらく)気にする国際的な文字セットです。名前付き文字のセット(例:「ラテン大文字A」または「ギリシャの小文字のアルファ」)とコードポイントのセット(それぞれに割り当てられた番号-たとえば、16進数で61と3B1の16進数)の間のマッピングを定義しますこれら2つのそれぞれ; Unicodeコードポイントの場合、標準表記はU + 0061とU + 03B1です)。

かつて、Unicodeは独自の文字セットをISO 10646の競合として多かれ少なかれ定義していました。これは16ビット文字セットでしたが、not UTF-16; UCS-2として知られていました。必要な文字の数を最小限に抑えるために、かなり議論の余地のある手法が含まれていました(漢語の統一-基本的に同じ文字であるようにかなり似ていた中国語、日本語、韓国語の文字を扱います)。

それ以来、Unicodeコンソーシアムは、それが機能しないことを暗黙に認め、現在は主にISO 10646文字セットをエンコードする方法に集中しています。主な方法は、UTF-8、UTF-16、およびUCS-4(別名UTF-32)です。それら(UTF-8を除く)には、LE(リトルエンディアン)およびBE(ビッグエンディアン)のバリアントもあります。

それ自体では、「Unicode」は上記のほとんどすべてを指すことができます(ただし、UTF-8など、明示的に表示される他のものはおそらく削除できます)。 「Unicode」の無条件の使用は、おそらくWindowsで最も頻繁に発生し、ほとんどの場合、UTF-16を指します。 UCS-2が最新の場合、Windows NTの初期バージョンはUnicodeを採用していました。 UCS-2が廃止と宣言された後(メモリが提供される場合はWin2k付近)、UCS-2に最も類似したUTF-16に切り替えました(実際、「基本的な多言語面」の文字については同じです。多くの西ヨーロッパ言語のすべての文字を含む)。

15
Jerry Coffin

UTF-16とUTF-8は両方ともUnicodeのエンコードです。 both Unicode;一方はmore Unicodeではありません。

マイクロソフトからの不幸な歴史的遺物に惑わされないでください。

7
Mark Ransom

Unicodeの開発は、今日使用されている大多数の言語の文字をマッピングするための新しい標準を作成することを目的としていました。 UTF-8は、ファイル内の文字をUnicodeにエンコードできる多くの方法があるため、ファイルをエンコードできる多くの方法の1つにすぎません。

ソース:

http://www.differencebetween.net/technology/difference-between-unicode-and-utf-8/

4
Trufa

Trufaのコメントに加えて、Unicodeは明示的にUTF-16ではありません。彼らが最初にUnicodeを検討したとき、16ビット整数でコードを保存するのに十分であると推測されましたが、実際にはそうではないことが判明しました。ただし、UTF-16は、8ビットおよび32ビットのバリエーションと並んで、Unicodeの別の有効なエンコードです。MicrosoftがNT派生オペレーティングシステムの実行時にメモリで使用するエンコードであると思います。

3
Tommy

データはバイトとして保存されることに注意してください。 Unicodeは、文字がコードポイント(一意の整数)にマップされる文字セットであり、これらのコードポイントデータをバイトに変換するものが必要です。そこで、UTF-8がエンコードと呼ばれるようになります-簡単です!

2
mrehan

それは奇妙だ。 Unicodeはエンコードではなく標準です。エンディアンを指定することは可能であるため、事実上UTF-16またはおそらく32です。

このメニューはどこから提供されますか?

1
MatTheCat