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


151

テキストのエンコーディングと文字セットについて混乱しています。多くの理由で、私は次の仕事で非ユニコード、非UTF8のものを学ばなければなりません。

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

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


この記事を参照してください。stackoverflow.com/questions/13743250/...
rghome

回答:


144

基本的に:

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

42
真ですが、実際には「文字セット」は通常、文字のレパートリーとエンコード方式の両方を指します。
アランムーア

@AlanMoore確かに、人々が「10進数」と言っているのとほとんど同じように、「10進数の区切り文字」がある数字を指します。それは実際には正しくありませんが、一部の人々がそれをそのように使用していることに注意する必要があります。
bvdb 2017年

2
それは正確ではありません。たとえば、Unicodeは文字セットを参照しますが、可能なエンコードは複数あります(UTF-8、UTF-16、UTF-32)。
rghome

84

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

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


20
javadocが「エンコーディング」ではなく「charset」を誤って使用していることに注意してください。たとえば、InputStreamReaderでは、「InputStreamReaderはバイトストリームから文字ストリームへのブリッジです。バイトを読み取り、指定された文字セットを使用してそれらを文字にデコードします。名前で指定するか、明示的に指定するか、プラットフォームのデフォルトの文字セットを受け入れることができます。」。ただし、それらが意味するのは「エンコーディング」です。
David Tonhofer 2014年

4
説明していただきありがとうございます。Unicodeは文字セットであり、UTF-8Unicodeの 1つのエンコード方法であり、UTF-16Unicodeのもう1つのエンコード方法です。
HongchaoZhang

47

他の回答に加えて、私はこの記事を読むことをお 勧めしますhttp://www.joelonsoftware.com/articles/Unicode.html

この記事のタイトルは、Joel Spolskyによって書かれた絶対にすべてのソフトウェア開発者は絶対に、確実にUnicodeと文字セットについて知っておく必要があります(言い訳はありません!)」です。エッセイは10年以上前のものですが、(残念ながら)内容はまだ有効です...


2
記事を紹介してくれてありがとう。それはある良いもの。
TK。

9
この答えは、なぜ私がJoelの記事を読まなければならないのを簡単に説明することで改善できます。
james.garriss 2013

@mattanjaあなたが提供したリンクは本当に素晴らしいです。共有いただきありがとうございます。投票した。
hagrawal 2015年

1
私はまた、Joel Spolskyのちょっとした付録であるこの素晴らしい記事を載せたいと思います。kunststube.net/encoding
mkb

初めて読んだとき、ジョエルの記事を理解できませんでした。むしろ、私はこのパワーポイントがより明確で具体的であるとわかりました:unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

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

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

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

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


HTML METAタグでcharset = 'utf-8'を読み取れるのはなぜでしょうか?それはずっと以前に定義されていたからです
Eildosa

26

今後訪れる人々のためにより多くの光を投げ、それが役に立てば幸いです。


キャラクターセット

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

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

コード化文字セット

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

エンコーディング

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

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

上記の3つの概念の詳細

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

11

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


これは受け入れられる答えになるはずです。これは、文字セット、コード化文字セット、およびエンコードの3つの概念を明確に定義しています。
Marcus Junius Brutus

6

それのためにググった。 http://en.wikipedia.org/wiki/Character_encoding

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

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

要約すると、エンコーディング:コードポイント->バイト文字セット:文字->バイト


5

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

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


全単射でなければなりませんか?
イェルクWミッターク

2
まあ、エンコードとデコードは確定的であるべきなので、実際にあいまいなマッピングがあってはなりません。コドメインとして連続しない整数のセットを使用することもできますが、テキストを格納するときにスペースが無駄になり、エンジニアは無駄なスペースを嫌います。
Kilian Foth、

1
多くの場合、レガシー文字エンコードは全単射ではありません。たとえば、IBM437では、βとβの両方が0xE1で表されます。
dan04 2010

3

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

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


1

私の意見では、「charset」という単語は、文字エンコーディング(一連のテキスト文字から一連のバイトへのマッピング)を名前で指定するために、HTTP、MIME、および同様の標準で使用されるパラメーターの識別に限定する必要があります。例:charset=utf-8

ただし、MySQL、Java、およびその他の場所では「charset」という単語が文字エンコーディングを意味する場合があることを知っています。


1

エンコーディングは、バイトと文字セットの文字との間のマッピングであるため、バイト文字の違いについて話し合い、理解しておくと役立ちます。

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

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

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

たとえば、60〜65の値で表されるASCII文字セットの6文字を次に示します。

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をネイティブで使用します。

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

たとえば、ISO 8859-1では、âは1バイトの値226で表されますが、UTF-8では2バイトです195, 162。しかし、中にISO 8859-1195, 1622つの文字、だろう、â

コンピュータが文字に関するデータを内部に保存するか、それを別のシステムに送信するとき、バイトを保存または送信します。システムがファイルを開いたり、メッセージを受信したりしてバイトが見えると想像してください195, 162。これらの文字がどのようにしてわかるのですか?

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

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