web-dev-qa-db-ja.com

エンコーディングと文字セットの違いは何ですか?

テキストのエンコードと文字セットについて混乱しています。多くの理由で、今後の作業で非Unicode、非UTF8の内容を学ぶ必要があります。

「ISO-2022-JP」のように、メールのヘッダーに「charset」という単語がありますが、テキストエディターにはそのようなエンコードはありません。 (私は、さまざまなテキストエディタを調べました。)

テキストエンコーディングと文字セットの違いは何ですか?ユースケースの例をいくつか見せていただければ幸いです。

137
TK.

基本的に:

  1. charsetは、使用できる文字のセットです
  2. エンコーディングは、これらの文字がメモリに格納される方法です
128

すべてのエンコーディングには特定の文字セットが関連付けられていますが、特定の文字セットに対して複数のエンコーディングが存在する場合があります。文字セットとは、単に文字のセットのように聞こえます。特定のスクリプトまたは言語向けの文字セットを含む、多数の文字セットがあります。

ただし、Unicodeへの移行は順調に進んでおり、ほぼすべての世界のスクリプトを表現できる文字セットが含まれています。ただし、Unicodeには複数のエンコーディングがあります。エンコーディングは、文字列をバイト文字列にマッピングする方法です。 Unicodeエンコードの例には、 TF-8TF-16 BE 、および TF-16 LE が含まれます。これらはそれぞれ、特定のアプリケーションまたはマシンアーキテクチャに利点があります。

79

他の回答に加えて、私はこの記事が良い読み物だと思います http://www.joelonsoftware.com/articles/Unicode.html

この記事のタイトルは、「すべてのソフトウェア開発者がユニコードと文字セットについて絶対に、積極的に知っておくべき絶対的な最小値(言い訳なし!)Joel Spolskyエッセイは10年以上前ですが、(残念ながら)コンテンツはまだ有効です...

45
mattanja

文字エンコードは次のもので構成されます。

  1. サポートされている文字のセット
  2. 文字と整数の間のマッピング(「コードポイント」)
  3. コードポイントが一連の「コード単位」としてエンコードされる方法(たとえば、UTF-16の16ビット単位)
  4. コード単位をバイトにエンコードする方法(ビッグエンディアンやリトルエンディアンなど)

ステップ#1自体は「文字レパートリー」または抽象「文字セット」であり、#1 +#2 =「コード化文字セット」です。

しかし、Unicodeが普及し、東アジア人を除くすべての人がシングルバイトエンコーディングを使用する前は、手順3と4は簡単でした(コードポイント=コード単位=バイト)。したがって、古いプロトコルでは、「文字エンコード」と「コード化文字セット」を明確に区別していませんでした。古いプロトコルは、エンコードを意味する場合にcharsetを使用します。

26
dan04

今後訪問する人たちにもっと光を投げる、それが役に立つことを願っています。


Character Set

各言語には文字があり、それらの文字のコレクションはその言語の「文字セット」を形成します。文字がエンコードされると、コードポイントと呼ばれる一意の識別子または番号が割り当てられます。コンピューターでは、これらのコードポイントは1つ以上のバイトで表されます。

文字セットの例: ASCII(すべての英語の文字をカバー)、ISO/IEC 646、Unicode(世界中のすべての生きている言語の文字をカバー)

コード化文字セット

コード化文字セットは、一意の番号が各文字に割り当てられているセットです。その一意の番号は「コードポイント」と呼ばれます。
コード化された文字セットは、コードページと呼ばれることもあります。

エンコーディング

エンコードは、同じエンコードスキームを使用して異なるシステム間で文字を均一に読み書きできるように、コードポイントをいくつかのバイトでマップするメカニズムです。

エンコードの例: ASCII、UTF-8、UTF-16、UTF-32などのUnicodeエンコードスキーム.

上記の3つの概念の詳細

  • これを考慮してください-Devanagariの文字 'क' 文字セットは10進数コードポイント 2325で、TFを使用すると2バイト(09 15)で表されます-16エンコード
  • 「ISO-8859-1」エンコーディングスキーム「ü」(これはラテン文字セットの文字にすぎません)はFCの16進値として表されますが、「UTF-8」ではC3 BCとして表されますUTF-16ではFE FF 00 FCとして。
  • 異なるエンコーディングスキームでは、同じコードポイントを使用して異なる文字を表すことができます。たとえば、「ISO-8859-1」(Latin1とも呼ばれます)では、文字「é」の10進コードポイント値は233です。ただし、ISO 8859-5 、同じコードポイントはキリル文字「щ」を表します。
  • 一方、Unicode文字セット内の単一のコードポイントは、ドキュメントに使用されたエンコードに応じて、実際に異なるバイトシーケンスにマップできます。コードポイント2325(16進表記で915)を持つデーバナーガリー文字कは、UTF-16エンコーディング(09 15)を使用する場合は2バイト、UTF-8を使用する3バイト(E0 A4 95)、またはUTFを使用する4バイトで表されます-32(00 00 09 15
19
hagrawal

文字セットまたは文字レパートリーは、単に文字のセット(順序付けられていないコレクション)です。コード化された文字セットは、レパートリーの各文字に整数(「コードポイント」)を割り当てます。エンコードは、コードポイントをバイトストリームとして明確に表す方法です。

10

それをグーグル。 http://en.wikipedia.org/wiki/Character_encoding

違いは微妙なようです。文字セットという用語は実際にはユニコードには適用されません。 Unicodeは一連の抽象化を通過します。抽象文字->コードポイント->バイトへのコードポイントのエンコード。

文字セットは実際にこれをスキップし、文字からバイトに直接ジャンプします。バイトのシーケンス<->文字のシーケンス

要するに、エンコード:コードポイント->バイト文字セット:文字->バイト

6
Fakrudeen

文字セットは単なるセットです。どちらかが含まれています。ユーロ記号、またはそうでない場合。それで全部です。

エンコーディングは、文字セットから整数セットへの全単射マッピングです。ユーロ記号をサポートする場合、特定の整数をその文字に割り当て、他には割り当てないようにする必要があります。

5
Kilian Foth

私の意見では、Wordの「charset」は、文字エンコード(一連のテキスト文字からバイトシーケンスへのマッピング)を名前で指定するためにHTTP、MIME、および同様の標準で使用されるパラメーターの識別に限定されるべきです。例えば:charset=utf-8

ただし、MySQL、Java、およびその他の場所では、Wordの「文字セット」を使用して文字エンコーディングを意味する場合があることは承知しています。

1
Peter O.

エンコーディングは、文字セットのバイトと文字の間のマッピングです。したがって、bytes文字

バイトは0〜255の数字と考えてください。一方、文字は「a」、「1」、「$」、「Ä」などの抽象的なものです。使用可能なすべての文字のセットは、文字セットと呼ばれます。

各文字には、それを表すために使用される1つ以上のバイトのシーケンスがあります。ただし、バイトの正確な数と値は使用されるencodingに依存し、多くの異なるエンコーディングがあります。

ほとんどのエンコードは、古い文字セットに基づいており、ASCIIと呼ばれるエンコードは1文字あたり1バイト(実際には7ビットのみ)で、米国で使用される多くの一般的な文字を含む128文字を含みます)英語。

たとえば、ASCII文字セットの6文字は、値60〜65で表されます。

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

完全なASCIIセットでは、使用される最小値はゼロで、最大値は127です(これらは両方とも非表示の制御文字です)。

ただし、基本的なASCIIが提供する文字(アクセント付きの文字、通貨記号、グラフィック記号など)よりも多くの文字が必要になると、ASCIIより多くの文字(異なる文字セット)が必要であり、128文字ではすべての文字を収めるには不十分であるため、異なるエンコードが必要です。一部のエンコードは1バイト(256文字)以上を提供します6バイトに。

時間の経過とともに、多くのエンコードが作成されました。 Windowsの世界にはCP1252またはISO-8859-1がありますが、LinuxユーザーはUTF-8を好む傾向があります。 JavaはUTF-16をネイティブで使用します。

あるエンコーディングの文字の1つのバイト値のシーケンスは、別のエンコーディングの完全に異なる文字を表している場合もあれば、無効な場合もあります。

たとえば、ISO 8859-1では、âは1バイトの値226UTF-8では2バイトです:195, 162。ただし、ISO 8859-1では、195, 162は2文字、Ã、¢です。

コンピューターが文字に関するデータを内部に保存するか、別のシステムに送信する場合、バイトを保存または送信します。システムがファイルを開いているか、メッセージを受信して​​いるときにバイト195, 162。これらがどのようなキャラクターであるかはどのようにしてわかりますか?

システムがそれらのバイトを実際の文字として解釈する(そしてそれらを表示するか、別のエンコードに変換する)ためには、使用されているエンコードを知る必要があります。そのため、エンコードはXMLヘッダーに表示されるか、テキストエディターで指定できます。バイトと文字の間のマッピングをシステムに伝えます。

1
rghome

私の意見では、文字セットはエンコード(コンポーネント)の一部であり、エンコードには文字セット属性があるため、文字セットは多くのエンコードで使用できます。たとえば、unicodeはUTF-8、UTF-16などのエンコーディングで使用される文字セットです。こちらの図をご覧ください。 See illustration here

Charsetのcharは、プログラミングの世界のchar型を意味するものではなく、実世界のcharを意味します。英語では、おそらく同じかもしれませんが、中国語のような他の言語では、「我」はcharsetsの不可分な「char」です(UNICODE、GB [GBKおよびGB2312で使用])、 'a'は文字セットの文字(ASCII、 ISO-8859 、UNICODE)です。

1
Eric Liu