Unicode と ASCII の正確な違いは何ですか?
ASCII には合計 128 文字 (拡張セットでは 256 文字) があります。
Unicode 文字のサイズ指定はありますか?
ASCII は、0 ~ 127 の数字にマップされる 128 文字を定義します。Unicode は 2 21文字(未満) を定義し、同様に 0 ~ 2 21 の数字にマップされます(ただし、すべての数字が現在割り当てられているわけではなく、一部は予約されています)。
Unicode は ASCII のスーパーセットであり、0 ~ 127 の数字は Unicode と同じ意味を ASCII で持っています。たとえば、数字の 65 は「ラテン大文字の 'A'」を意味します。
通常、Unicode 文字は 1 つの 8 ビット バイトに収まらないため、UTF-32 や UTF-8 など、Unicode 文字をバイト シーケンスに格納する方法は多数あります。
ASCII と Unicode が最初に作成された理由を理解することで、2 つの違いを理解することができました。
アスキー、起源
他の回答で述べたように、ASCII は 7 ビットを使用して文字を表します。7 ビットを使用することで、最大 2^7 (= 128) の異なる組み合わせを使用できます*。つまり、最大 128 文字を表すことができます。
待って、7 ビット?しかし、なぜ 1 バイト (8 ビット) ではないのでしょうか?
最後のビット (8 番目) は、パリティ ビットとしてエラーを回避するために使用されます。これは数年前に関連していました。
ほとんどの ASCII 文字は、abc、ABC、123、?&! などのアルファベットの印刷可能な文字です。その他は、キャリッジ リターン、ライン フィード、タブなどの制御文字です。
ASCII でのいくつかの文字のバイナリ表現を以下に示します。
0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)
完全な ASCII テーブルはこちらを参照してください。
ASCII は英語専用でした。
何?なんで英語だけ?そこには非常に多くの言語があります!
当時のコンピュータ産業の中心地はアメリカだったからです。結果として、アクセント記号や á、ü、ç、ñ などの記号 (別名diacritics ) をサポートする必要はありませんでした。
アスキー拡張
一部の賢い人々は、8 番目のビット (パリティに使用されるビット) を使用して、より多くの文字をエンコードして言語をサポートし始めました (たとえば、フランス語で「é」をサポートするため)。余分なビットを 1 つ使用するだけで、元の ASCII テーブルのサイズが 2 倍になり、最大 256 文字 (2^8 = 256 文字) にマップされます。以前のように 2^7 ではありません (128)。
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
この「以前のように 7 ビットではなく 8 ビットに拡張された ASCII」の名前は、単に「拡張 ASCII」または「8 ビット ASCII」と呼ばれることがあります。
以下のコメントで@Tomが指摘したように、「拡張ASCII」などはありませんが、これはこの8ビットのトリックを参照する簡単な方法です。ISO Latin-1 とも呼ばれる ISO 8859-1など、8 ビット ASCII テーブルにはさまざまなバリエーションがあります。
ユニコード、台頭
拡張 ASCII は、ラテン アルファベットに基づく言語の問題を解決します。完全に異なるアルファベットを必要とする他の言語についてはどうでしょうか。ギリシャ語?ロシア?中国人など?
まったく新しい文字セットが必要だったでしょう... それが Unicode の背後にある合理的な理由です。Unicode にはすべての言語のすべての文字が含まれているわけではありませんが、膨大な量の文字が含まれていることは確かです (この表を参照してください)。
テキストを「Unicode」としてハード ドライブに保存することはできません。Unicode は、テキストの抽象的な表現です。この抽象表現を「エンコード」する必要があります。そこでエンコーディングの出番です。
エンコーディング: UTF-8 vs UTF-16 vs UTF-32
この答えは、基本を説明するのにかなり良い仕事をします:
UTF-8 は、最初の 128 文字に ASCII セットを使用します。これは、ASCII テキストが UTF-8 でも有効であることを意味するため、便利です。
ニーモニック:
ノート:
なぜ 2^7 なのか?
これは明らかな場合もありますが、念のためです。0 または 1 ( Binary Code ) で埋められた 7 つのスロットを利用できます。それぞれに 2 つの組み合わせが可能です。7 つのスポットがある場合、2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128 通りの組み合わせがあります。これを 7 つの車輪を持つコンビネーション ロックと考えてください。各車輪には 2 つの数字しかありません。
出典:ウィキペディア、このすばらしいブログ投稿、およびこの要約を最初に投稿したMocki.co 。
ASCII には 0 ~ 127 の 128 のコード ポイントがあります。1 つの 8 ビット バイトに収まり、128 ~ 255 の値は他の文字に使用される傾向があります。互換性のない選択により、コードページの災害が発生します。あるコード ページでエンコードされたテキストは、別のコード ページを想定または推測するプログラムでは正しく読み取ることができません。
この災害を解決するためにユニコードが登場しました。バージョン 1 は 65536 コード ポイントで始まり、通常は 16 ビットでエンコードされました。その後、バージョン 2 で 110 万のコード ポイントに拡張されました。現在のバージョンは 6.3 で、利用可能な 110 万のコード ポイントのうち 110,187 を使用しています。それはもはや16ビットに収まりません。
v2 が登場したとき、16 ビットでのエンコードは一般的で、たとえば Microsoft や Apple オペレーティング システムで使用されていました。そして Java のような言語ランタイム。v2 仕様では、これらの 110 万のコード ポイントを 16 ビットにマッピングする方法が考案されました。UTF-16 と呼ばれるエンコーディング。1 つのコード ポイントが 2 バイトまたは 4 バイトの可変長エンコーディングです。元の v1 コード ポイントは 2 バイト、追加されたものは 4 バイトかかります。
*nix オペレーティング システムとツールで使用される、非常に一般的なもう 1 つの可変長エンコーディングは UTF-8 です。コード ポイントは 1 ~ 4 バイトで、元の ASCII コードは 1 バイトで残りはそれ以上になります。唯一の非可変長エンコーディングは UTF-32 で、コード ポイントに 4 バイトを使用します。かなりもったいないのであまり使わない。他にも、UTF-1 や UTF-7 など、広く無視されているものがあります。
UTF-16/32 エンコーディングの問題は、バイトの順序が、テキスト ストリームを作成したマシンのエンディアンに依存することです。したがって、UTF-16BE、UTF-16LE、UTF-32BE、および UTF-32LE の組み合わせに追加してください。
これらの異なるエンコーディングの選択肢を持つことで、プログラマーの間でどの UTF の選択肢が「最適」であるかという激しい議論とともに、コード ページの惨事がある程度復活します。オペレーティング システムのデフォルトとの関連性は、ほぼ一線を画しています。1 つの対策は、ストリームの残りの部分がどのようにエンコードされているかを示す、テキスト ストリームの先頭にある特殊なコードポイント (U+FEFF、ゼロ幅スペース) である BOM、バイト オーダー マークの定義です。これは、UTF エンコーディングとエンディアンの両方を示し、テキスト レンダリング エンジンに対してニュートラルです。残念ながら、これはオプションであり、多くのプログラマーはそれを省略する権利があると主張しているため、事故は依然としてかなり一般的です.
ASCII には 128 のコード位置があり、グラフィック文字と制御文字 (制御コード) に割り当てられています。
Unicode には 1,114,112 のコード位置があります。現在、そのうちの約 100,000 が文字に割り当てられており、多くのコード ポイントが永続的に非文字 (つまり、文字のエンコードに使用されていない) にされており、ほとんどのコード ポイントはまだ割り当てられていません。
ASCII と Unicode の唯一の共通点は次のとおりです。1) 文字コードです。2) Unicode の最初の 128 のコード位置は、ASCII と同じ意味を持つように定義されていますが、ASCII 制御文字のコード位置は、ASCII 名に対応する名前を持つ制御文字を示すものとして定義されているだけですが、その意味は次のとおりです。 Unicode では定義されていません。
ただし、Unicode は (Unicode 標準でも!) 「ワイド ASCII」として特徴付けられることがあります。これは主に、Unicode がかつての ASCII と同じように普遍的な文字コードであることを意図しているという考えを伝えようとするスローガンです(ただし、ASCII の文字レパートリーは普遍的な使用にはどうしようもなく不十分でした)。さまざまなシステムやアプリケーション、さまざまな言語に対応しています。
Unicode 自体は、文字の「論理サイズ」のみを定義します。各文字には、特定の範囲のコード番号があります。これらのコード番号は、さまざまな転送エンコーディングを使用して表すことができます。また、メモリ内の内部では、Unicode 文字は通常、文字の範囲に応じて、1 文字あたり 1 つまたは 2 つの 16 ビット量を使用して表現されます。場合によっては、1 文字あたり 1 つの 32 ビット量を使用します。
Unicode には 120,000 を超える文字のレパートリーが含まれているため、ASCII は 128 文字を定義します。