ASCIIとUnicodeの違いは何ですか?


407

回答:


534

ASCIIは128文字を定義し、0〜127の数字にマップされます。ユニコード定義2つの(以下)21、同様に、番号0~2にマップ文字、21(ただし、すべての数が現在割り当てられていない、といくつかは予約されています)。

UnicodeはASCIIのスーパーセットであり、0〜127の数字は、ASCIIでもUnicodeと同じ意味です。たとえば、数値65は「ラテン大文字 'A'」を意味します。

Unicode文字は一般に1つの8ビットバイトに収まらないため、UTF-32やUTF-8など、Unicode文字をバイトシーケンスに格納する方法は多数あります。


4
@riderBill:今何?どの3ビットについて話しているのですか?Unicodeにはビットはありません。ただのコードポイント。
Kerrek SB 2016

@riderBill:もう一度:今話している「3バイト」はどれですか。:-)(これはUnicodeとは関係ありません。Unicodeは数値に意味を割り当てることだけを目的としており、ビットやバイトを意味するものではありません。)
Kerrek SB

8
@riderBill:Unicodeは「1〜4バイトを使用」しませ。Unicodeは、数値に対する意味の割り当てです。バイトは使用しません。Unicodeコードポイントをバイトのストリームとして表すための特定の標準化されたエンコードスキームがありますが、それらはUnicodeに対して文字セットとして直交しています。(はい、自由に削除してください。)
Kerrek SB

@CleanCrispCode Unicodeは、実際にはそれ自体がASCIIのスーパーセットであるISO-8859-1のスーパーセットです。知っておくと便利な場合があります。
Mark Ransom

8
明確にするために、Unicode 文字セット自体はISO-8859-1 文字セットのスーパーセットですが、UTF-8 エンコーディングはISO-8859-1 エンコーディングのスーパーセットではなく、ASCII エンコーディングです。
minmaxavg

393

理解なぜ ASCIIおよびUnicodeが最初の場所で作成されたが、私は両者の違いを理解して助けました。

ASCII、起源

他の回答で述べたように、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は英語のみを意味していました。

何?なぜ英語だけなのか?非常に多くの言語があります!

コンピュータ業界の中心は当時アメリカにあったからです。結果として、アクセントや、á、ü、ç、ñなどの他のマーク(別名発音区別符号)をサポートする必要はありませんでした。

ASCII拡張

一部の賢い人々は、8番目のビット(パリティーに使用されるビット)を使用して、言語をサポートするために(たとえば、フランス語の「é」をサポートするために)より多くの文字をエンコードし始めました。1つの余分なビットを使用するだけで、元のASCIIテーブルのサイズが2倍になり、最大256文字(2 ^ 8 = 256文字)にマップされます。以前のように2 ^ 7ではありません(128)。

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

この「ASCIIは以前のように7ビットではなく8ビットに拡張されました」の名前は、単に「拡張ASCII」または「8ビットASCII」と呼ばれる場合があります。

以下のよう@Tomは以下の彼のコメントで指摘があっ「などというものではありません拡張ASCIIは」まだこれは、この8ビットのトリックを参照するための簡単な方法です。8ビットASCIIテーブルには多くのバリエーションがあります。たとえば、ISO 8859-1、ISO Latin-1とも呼ばれます。

Unicode、The Rise

拡張されたASCIIは、ラテンアルファベットに基づく言語の問題を解決します...完全に異なるアルファベットを必要とする他の言語についてはどうですか?ギリシャ語?ロシア?中国語など?

まったく新しい文字セットが必要だったでしょう...それがUnicodeの背後にある合理的です。Unicodeにはすべての言語のすべての文字が含まれているわけではありませんが、膨大な数の文字が含まれていることは確かです(この表を参照)。

テキストを「Unicode」としてハードドライブに保存することはできません。Unicodeはテキストの抽象的な表現です。この抽象表現を「エンコード」する必要があります。ここでエンコーディングが機能します。

エンコーディング:UTF-8 vs UTF-16 vs UTF-32

この答えは基本を説明するのにかなり良い仕事をします:

  • UTF-8およびUTF-16は可変長エンコーディングです。
  • UTF-8では、文字は最低8ビットを占めることがあります。
  • UTF-16では、文字長は16ビットで始まります。
  • UTF-32は32ビットの固定長エンコーディングです。

UTF-8は、最初の128文字にASCIIセットを使用します。これは、ASCIIテキストがUTF-8でも有効であることを意味するので便利です。

ニーモニック:

  • UTF- 8:最小8ビット。
  • UTF- 16:最小16ビット。
  • UTF- 32:最小および最大32ビット。

注意:

なぜ2 ^ 7なのか?

これは一部の人にとっては明白ですが、念のためです。7つのスロットがあり、0または1(バイナリコード)で埋められています。それぞれに2つの組み合わせがあります。7つのスポットがある場合、2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128の組み合わせになります。これは、7つのホイールが付いたコンビネーションロックであり、各ホイールには2つの番号しかない。

出典:ウィキペディアこの素晴らしいブログ投稿、および私が最初にこの概要を投稿したMocki


7
テキストはありませんが、エンコードされたテキストです。一部のエンコーディングは、特に256以下のコードポイントを持つ文字セットの場合、非常に単純です。「拡張ASCII」は非常にあいまいな用語です。ギリシャ語、ロシア語、ポーランド語をサポートするものもあります。ASCIIは、á、ü、ç、ñを使用する英語のテキストには不十分です。人間の言語ではなくコンピュータ言語をサポートするように設計されていたのではないかと思います。独断的に言えば、ファイルまたはストリームを書き込むとき、文字セットがあり、エンコーディングを選択します。あなたの読者はバイトとエンコーディングの知識を取得する必要があります。そうでない場合、通信は失敗しました。
トムBlodget 16

補遺有難うございます。私はそれに応じて答えを更新しました。
Andrew

ありがとうございました。ASCIIテーブルでは文字コードが0〜127と表示されていますが、UTF-8テーブルではコードが整数ではなく16進数と表示されています。これには理由がありますか?UTF-Xテーブルが00-AFに対して0-127 / 255/65535を表示しないのはなぜですか?これはどういう意味ですか?
wayofthefuture 2017年

お返事ありがとうございます。簡単な質問:「UTF-16では、文字の長さは16ビットで始まります」-これは、英数字が8ビット文字であるため、UTF-16で表現できないことを意味しますか?
Moondra 2017

正解です。問題は1つだけです-ポーランド語は本当に別のアルファベットを使用していますか?私たちは英語と同じものを使用すると思っていましたが、追加の文字がいくつかありますか?
Nicofisi

89

ASCIIには、0から127までの128のコードポイントがあります。これは、単一の8ビットバイトに収まり、128から255の値は、他の文字に使用される傾向があります。互換性のない選択により、コードページに障害が発生します。あるコードページでエンコードされたテキストは、別のコードページを想定または推測するプログラムでは正しく読み取ることができません。

この災害を解決するために、Unicodeが登場しました。バージョン1は65536のコードポイントから始まり、通常は16ビットでエンコードされています。後にバージョン2で110万のコードポイントに拡張されました。現在のバージョンは6.3で、利用可能な110万のコードポイントのうち110,187を使用しています。それはもはや16ビットには適合しません。

16ビットでのエンコードは、v2が登場したときに一般的であり、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つの対抗策は、BOMの定義、バイトオーダーマーク、テキストストリームの先頭にある特別なコードポイント(U + FEFF、ゼロ幅スペース)であり、残りのストリームのエンコード方法を示します。これは、UTFエンコーディングとエンディアンの両方を示し、テキストレンダリングエンジンに対して中立です。残念ながらそれはオプションであり、多くのプログラマーはそれを省略する権利を主張しているため、事故は依然としてかなり一般的です。


31

javaはUnicodeのサポートを提供します。つまり、すべてのワールドワイドアルファベットをサポートします。したがって、Javaのcharのサイズは2バイトです。範囲は0〜65535です。

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


説明するキーピクチャ..ニース
ポンマリスブラマニアン

2
残念なことに、それは間違っています。「ASCIIコード(128)」は正しいでしょう。
Mark Tolonen

15

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ビット数量を使用して表されます。


2
最近のUnicodeの最も一般的なエンコーディングはUTF-8だと思います。UTF-8は、コードポイントのほとんどを1、2、または3バイトでエンコードします。
Binarus

14

ASCIIとUnicodeは2つの文字エンコーディングです。基本的に、これらはデジタルメディアで書き込み、保存、送信、読み取りできるように、差分文字をバイナリで表す方法の標準です。2つの主な違いは、文字をエンコードする方法と、それぞれに使用するビット数です。ASCIIは当初、各文字のエンコードに7ビットを使用していました。これは後に拡張ASCIIで8に増加し、オリジナルの明らかな不十分さに対処しました。対照的に、Unicodeは可変ビットエンコーディングプログラムを使用しており、32、16、および8ビットエンコーディングから選択できます。より多くのビットを使用すると、より大きなファイルを犠牲にしてより多くの文字を使用できますが、より少ないビットは限られた選択肢を提供しますが、多くのスペースを節約します。より少ないビットを使用する(つまり、

Unicodeが問題であった主な理由の1つは、多くの非標準の拡張ASCIIプログラムから生じました。マイクロソフトや他のほとんどのソフトウェア会社で使用されている一般的なページを使用しているのでない限り、ボックスとして表示される文字で問題が発生する可能性があります。Unicodeは、すべての文字コードポイントが標準化されているため、この問題を事実上解消します。

Unicodeのもう1つの大きな利点は、最大で膨大な数の文字に対応できることです。このため、Unicodeには現在ほとんどの記述言語が含まれており、さらに多くの余地があります。これには、英語のような典型的な左から右のスクリプト、さらにはアラビア語のような右から左のスクリプトも含まれます。中国語、日本語、およびその他の多くのバリアントもUnicodeで表現されます。したがって、Unicodeがすぐに置き換えられることはありません。

当時広く使用されていた古いASCIIとの互換性を維持するために、Unicodeは最初の8ビットが最も一般的なASCIIページのビットと一致するように設計されました。したがって、ASCIIエンコードされたファイルをUnicodeで開いても、ファイルにエンコードされた正しい文字が得られます。これにより、すでにASCIIを使用していたユーザーに新しいエンコード標準を採用することによる影響が軽減されたため、Unicodeの採用が容易になりました。

概要:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

引用元:http : //www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


1

ストレージ

与えられた数字は1文字を格納するためのものです

  • ASCII ⟶2 7ビット(1バイト
  • 拡張 ASCII⟶2 8ビット(1バイト)
  • UTF- 8⟶最小2 8、最大2 32ビット(最小1、最大4バイト)
  • UTF- 16⟶最小2 16ビット、最大2 32ビット(最小2、最大4バイト)
  • UTF- 32⟶2 32ビット(4バイト)

利用状況(2020年2月現在)

さまざまな文字エンコーディングを使用しているウェブサイトの割合


0

Unicodeには120,000文字を超えるレパートリーがあるため、ASCIIは128文字を定義します。


4
このささいな複製の「回答」の場合は-1で、以前の回答に何も追加されていません。このような重複した混乱を追加しないでください(正当な他の方法で担当者を取得します)。
cellepo 2018年

-1

UTFがどのようにASCIIのスーパーセットであるかを超えて、ASCIIとUTFの間で知っておくべきもう1つの良い違いは、ディスクファイルのエンコーディングとデータ表現およびランダムメモリへの格納の点です。プログラムは、データの先頭で特別なバイトオーダーマークコードを検出するか、またはプログラマーからデータがテキストであると想定し、そのことを示すパターンをチェックすることにより、特定のデータをASCIIまたはUTF文字列として理解する必要があることを認識しています。あるテキストエンコーディングまたは別のテキストエンコーディングで。

0x16進データの従来の接頭表記を使用すると、基本的に適切な参照は、ASCIIテキストがバイト値で始まり、考えられるASCII文字値の 1つ0x000x7F表すことです。UTFテキストは通常0xEF 0xBB 0xBF、UTF8 のバイトで始まることで示されます。UTF16の場合、開始バイト0xFE 0xFF、または0xFF 0xFEが使用され、テキストバイトのエンディアン順は開始バイトの順序で示されます。可能なバイト値のASCII範囲にないバイト値の単純な存在は、データがおそらくUTFであることも示しています。

異なるコードを使用してデータを特定のエンコード標準でエンコードされたテキストとして解釈する必要があることを示す他のバイトオーダーマークがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.