テキストのエンコーディングと文字セットについて混乱しています。多くの理由で、私は次の仕事で非ユニコード、非UTF8のものを学ばなければなりません。
「ISO-2022-JP」のように電子メールのヘッダーに「charset」という単語を見つけましたが、テキストエディターにはそのようなエンコーディングはありません。(私はさまざまなテキストエディタを見回しました。)
テキストエンコーディングと文字セットの違いは何ですか?いくつかの使用例を見せていただければ幸いです。
テキストのエンコーディングと文字セットについて混乱しています。多くの理由で、私は次の仕事で非ユニコード、非UTF8のものを学ばなければなりません。
「ISO-2022-JP」のように電子メールのヘッダーに「charset」という単語を見つけましたが、テキストエディターにはそのようなエンコーディングはありません。(私はさまざまなテキストエディタを見回しました。)
テキストエンコーディングと文字セットの違いは何ですか?いくつかの使用例を見せていただければ幸いです。
回答:
基本的に:
すべてのエンコーディングには特定の文字セットが関連付けられていますが、特定の文字セットに対して複数のエンコーディングが存在する場合があります。文字セットとは、単に文字のセットのようなものです。特定のスクリプトまたは言語向けの文字セットを含む、多数の文字セットがあります。
ただし、ほとんどすべての世界のスクリプトを表すことができる文字セットを含むUnicodeへの移行は順調に進んでいます。ただし、Unicodeには複数のエンコーディングがあります。エンコーディングは、文字列をバイト列にマッピングする方法です。Unicodeエンコーディングの例には、UTF-8、UTF-16 BE、UTF-16 LEなどがあります。これらはそれぞれ、特定のアプリケーションまたはマシンアーキテクチャに利点があります。
他の回答に加えて、私はこの記事を読むことをお 勧めしますhttp://www.joelonsoftware.com/articles/Unicode.html
この記事のタイトルは、Joel Spolskyによって書かれた「絶対にすべてのソフトウェア開発者は絶対に、確実にUnicodeと文字セットについて知っておく必要があります(言い訳はありません!)」です。エッセイは10年以上前のものですが、(残念ながら)内容はまだ有効です...
文字エンコーディングは次のもので構成されます。
ステップ#1自体は「文字レパートリー」または抽象的な「文字セット」であり、#1 +#2 =「コード化文字セット」です。
しかし、Unicodeが普及し、すべての人(東アジア人を除く)がシングルバイトエンコーディングを使用する前は、手順#3と#4は簡単でした(コードポイント=コード単位=バイト)。したがって、古いプロトコルは「文字エンコーディング」と「コード化文字セット」を明確に区別していませんでした。古いプロトコルはcharset
、本当にエンコーディングを意味するときに使用します。
今後訪れる人々のためにより多くの光を投げ、それが役に立てば幸いです。
各言語には文字があり、それらの文字の集まりがその言語の「文字セット」を形成します。文字がエンコードされると、一意の識別子またはコードポイントと呼ばれる番号が割り当てられます。コンピュータでは、これらのコードポイントは1バイト以上で表されます。
文字セットの例: ASCII(すべての英語の文字をカバー)、ISO / IEC 646、Unicode(世界中のすべての生きている言語の文字をカバー)
コード化文字セットは、各文字に一意の番号が割り当てられているセットです。その一意の番号は「コードポイント」と呼ばれます。
コード化文字セットは、コードページと呼ばれることもあります。
エンコーディングは、コードポイントをいくつかのバイトにマップするメカニズムであり、同じエンコーディングスキームを使用して、異なるシステム間で文字を均一に読み書きできます。
エンコードの例: ASCII、UTF-8、UTF-16、UTF-32などのUnicodeエンコードスキーム。
09 15
FC
、「UTF-8」C3 BC
ではUTF-16として表されFE FF 00 FC
ます。09 15
)を使用すると2バイト、UTF-8(E0 A4 95
)では3 バイト、UTF-32では4バイトで表されます。(00 00 09 15
)文字セット、または文字レパートリーは、単に文字のセット(順不同のコレクション)です。コード化文字セットは、レパートリーの各文字に整数(「コードポイント」)を割り当てます。エンコーディングは、コードポイントをバイトのストリームとして明確に表す方法です。
それのためにググった。 http://en.wikipedia.org/wiki/Character_encoding
違いは微妙なようです。文字セットという用語は、実際にはUnicodeには適用されません。Unicodeは一連の抽象化を通過します。抽象文字->コードポイント->バイトへのコードポイントのエンコード。
文字セットは実際にはこれをスキップし、文字からバイトに直接ジャンプします。バイトのシーケンス<->文字のシーケンス
要約すると、エンコーディング:コードポイント->バイト文字セット:文字->バイト
文字セットは単なるセットです。ユーロ記号が含まれている、または含まれていない。それで全部です。
エンコーディングは、文字セットから整数のセットへの全単射マッピングです。ユーロ記号をサポートしている場合、特定の整数をその文字に割り当て、他の文字には割り当てないようにする必要があります。
私の意見では、文字セットはエンコーディング(コンポーネント)の一部であり、エンコーディングには文字セット属性があるため、文字セットは多くのエンコーディングで使用できます。たとえば、unicodeは、UTF-8、UTF-16などのエンコーディングで使用される文字セットです。こちらのイラストをご覧ください:
charsetのcharは、プログラミング世界のchar型を意味するのではなく、実世界のcharを意味します。英語では同じかもしれませんが、中国語のように他の言語では、「我」は文字セットの不可分な「char」です(UNICODE、GB [GBKおよびGB2312で使用])、 'a'も文字セット(ASCII、ISO-8859、UNICODE)の文字です。
エンコーディングは、バイトと文字セットの文字との間のマッピングであるため、バイトと文字の違いについて話し合い、理解しておくと役立ちます。
バイトは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-1、195, 162
2つの文字、だろう、â。
コンピュータが文字に関するデータを内部に保存するか、それを別のシステムに送信するとき、バイトを保存または送信します。システムがファイルを開いたり、メッセージを受信したりしてバイトが見えると想像してください195, 162
。これらの文字がどのようにしてわかるのですか?
システムがそれらのバイトを実際の文字として解釈する(そして、それらを表示するか、別のエンコーディングに変換する)ためには、使用されているエンコーディングを知る必要があります。そのため、エンコーディングはXMLヘッダーに表示されるか、テキストエディターで指定できます。これは、バイトと文字の間のマッピングをシステムに通知します。