文字セットの名前は「Unicode」で、「UTF-8」は Unicode 文字セットの特定のエンコーディングの名前だと思っていましたが、参照するときに「エンコーディング」と「文字セット」という用語が同じ意味で使用されているのをよく見かけます。 UTF-8に。
例えば、
<meta charset="UTF-8">
対
<?xml version="1.0" encoding="UTF-8" ?>
UTF-8 はエンコーディングまたは文字セットですか?
UTF-8 はエンコーディングであり、その用語はそれを定義する RFC で使用されています。これを以下に引用します。
「エンコーディング」と「文字セット」という用語が同じ意味で使用されているのをよく見かけます
Unicode が登場する前は、キリル文字やギリシャ文字などのアルファベット†を使用する場合、そのアルファベットの文字のみにエンコードされるエンコーディングを使用する必要がありました。したがって、 encodingとcharsetという用語はしばしば混同されますが、意味は異なります。
ただし、クリンゴン語を除くほとんどの言語の文字が含まれているため、Unicode は通常、考慮する必要がある唯一の文字セットです。
† - 文字が話し言葉の音に直接対応する一種の *文字セット* であるアルファベット。文字セットは、コード単位 (整数) から、書き言葉の文字、記号、グリフ、またはその他のマークへのマッピングです。Unicode は、21b 整数を Unicode コードポイントにマップする文字セットです。Unicode コンソーシアムの用語集では、次のように説明されています。
ユニコード
- 世界のすべての言語で使用される文字のデジタル表現の標準。Unicode は、任意の言語のテキストを格納、検索、および交換するための統一された手段を提供します。現在のすべてのコンピューターで使用されており、インターネット上でテキストを処理するための基盤となっています。Unicode は、Unicode コンソーシアム ( http://www.unicode.org ) によって開発および維持されています。
- Unicode コンソーシアムによって開発および維持されている、ソフトウェアの国際化およびローカリゼーションの標準に適用されるラベル。
エンコーディングは、文字列から文字列へのマッピングです。UTF-8 は、バイト文字列 (8b の整数) をコードポイントの文字列 (21b の整数) にマップするエンコーディングです。Unicode コンソーシアムはこれを「文字エンコード方式」と呼び、 RFC 3629で定義されています。
ただし、最初に提案された UCS のエンコーディングは、現在の多くのアプリケーションやプロトコルと互換性がなかったため、UTF-8 の開発につながりました。
UTF-8は、一連の抽象整数(抽象文字を示すUnicodeコードポイント)をバイトのセットにエンコードするという意味で、エンコードです。(Unicodeのスペクタクルを通じて、 ISO-8859-1などの「文字セット」もテーブル駆動型の「エンコーディング」であると言えます。これは、少数のコードポイントをバイトとしてエンコードするという意味ですが、これは用語の乱用であり、おそらくあまり役に立ちません)。
整数のシーケンスは(ある基本的な意味で)「Unicode文字列」ですが、これらをディスクに保存したり、ネットワーク経由で送信したりするには、バイトのシーケンスとしてエンコードする必要があります。UTF-8はそれを行う1つの方法であり、UTF-16は別の方法です。1つのUnicode文字列は、2つの異なる方法でエンコードされている場合、2つの異なるバイトストリームとして表されます。
ここには複数の細かい答えがありますが、昨日、この問題を最小限のサイズに縮小するために時間を費やしたので、これはそのテキストを再利用する幸せな機会を提供します。
絶対最小すべてのソフトウェア開発者に関するJoelSpolskyの記事は、Unicodeと文字セット(言い訳なし!)について絶対に、積極的に知っておく必要があります。これは(確かに)前にここで言及されていますが、繰り返しになります。しかし、それは完全に最小限ではないと思います。
同僚に「unicode」を説明しなければならなかった2、3の機会に、イルミネーションの鍵となったのは抽象的なUnicodeコードポイントの概念でした。私の成功した説明の構造は次のようなものでした:
ユニコードコンソーシアムは(多くの苦痛と交渉をもって)使用中の文字の大部分に数字を与えることに成功しました。これらの番号は(専門用語)「コードポイント」と呼ばれます。
「文字A」にはコードポイントがあり、これはフォントに依存しません。したがって、「A」と「a」のコードポイントは異なりますが、ローマン、ボールド、イタリック、セリフ、サンセリフ(非常に多くのセテラ)は区別されません。日本語の漢字、テングワール、クリンゴン文字(たとえば)にはコードポイントがあります(これは注目を集めています)。
「Unicode文字列」は(概念的には)コードポイントのシーケンスです。これは数学的な整数のシーケンスです。これらがバイト、2バイト、または4バイトの単語であるかどうかを尋ねるのは意味がありません。シーケンスはコンピューターとは何の関係もありません。
ただし、その整数のシーケンスを誰かに送信したり、コンピューターのディスクに保存したりする場合は、それをエンコードするために何かを行う必要があります。数列を紙に書き留めることもできますが、この時点ではコンピューターに特化しましょう。これをコンピュータに保存または送信する場合は、これらの整数を一連のバイトに変換する必要があります。これを行うには複数の手順があり、これらの各手順は「エンコーディング」と呼ばれます。これらの「エンコーディング」の1つはUTF-8です。
'Unicodeファイルを読み取る'とは、ディスク上の一連のバイトから始まり、概念的には一連の整数で終わることになります。'unicode file'が何らかの形でUTF-8でエンコードされるように示されている場合は、 RFC 3629で定義されているアルゴリズムを使用して、そのバイトシーケンスをデコードして整数シーケンスを取得する必要があります。'unicode string'に対する後続のすべての操作は、コードポイントのシーケンスに関して定義され、'UTF-8'としてディスク上で開始されたという事実は忘れられています。
Unicode標準では、これをエンコード形式またはエンコードスキームと呼んでいます。Unicodeには単一の文字セット(Unicode文字セットまたはユニバーサル文字セットと呼ばれます)があり、すべてのUTFエンコード形式とエンコードスキームでそのセット内のすべての文字をエンコードできます。
他の多くの用語と同様に、プログラマーはあちこちで用語を不適切に使用する傾向があるようです。これは、これのもう1つの例にすぎません。
UTF-8 はエンコーディングです。ただし、エンコーディングは文字セットと呼ばれることが多いため、多くのプロトコルでは、charset
文字エンコーディングを指定するパラメーターにパラメーター名を使用します。そのため、charset
は単なる識別子です。