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