ホームページ >バックエンド開発 >PHPチュートリアル >文字セットのエンコーディングである ASCII、Unicode、UTF-8 についてどれくらい知っていますか?文字セットエンコーディングの概要 (コレクション)
文字セット エンコーディング ASCII、Unicode、UTF-8 についてどれくらい知っていますか?この記事では、文字セットのエンコーディングについて徹底的に理解します。この記事では、ASCII、Unicode、UTF-8 エンコードの問題と変換、および分析例を紹介します。記事を読み始めてください
1. ASCII コード
コンピューター内部では、すべての情報は最終的にはバイナリ値であることがわかっています。各バイナリ ビット (ビット) には 0 と 1 の 2 つの状態があるため、8 つのバイナリ ビットを組み合わせて 256 個の状態にすることができ、これをバイトと呼びます。つまり、1 バイトを使用して合計 256 の異なる状態を表すことができ、各状態は 00000000 から 11111111 までの 256 個のシンボルに対応します。
1960 年代に、米国は英語の文字とバイナリ ビットの関係を統一する一連の文字エンコーディングを策定しました。これは ASCII と呼ばれ、現在でも使用されています。
ASCII コードでは、合計 128 文字のエンコーディングが指定されます。たとえば、SPACE は 32 (バイナリ 00100000)、大文字の A は 65 (バイナリ 01000001) です。これら 128 個のシンボル (印刷できない 32 個の制御シンボルを含む) はバイトの最後の 7 ビットのみを占め、最初のビットは一律に 0 に設定されます。
ASCII 制御文字
ASCII 表示可能文字
2. 非 ASCII エンコーディング
英語は 128 個の記号でエンコードできますが、他の言語を表すには 128 個の記号では不十分です。 。たとえば、フランス語では、文字の上に発音記号がある場合、ASCII コードでは表現できません。その結果、ヨーロッパの一部の国は、バイト内のアイドル状態の最上位ビットを使用して新しいシンボルをエンコードすることを決定しました。たとえば、フランス語の é のエンコードは 130 (バイナリ 10000010) です。その結果、これらのヨーロッパ諸国で使用されているエンコード システムは、最大 256 個のシンボルを表現できます。
しかし、ここで新たな問題が発生します。国が異なれば文字は異なります。そのため、すべての国が 256 記号のエンコードを使用しているとしても、表す文字は異なります。たとえば、130 はフランス語のエンコードでは é を表し、ヘブライ語のエンコードでは文字 Gimel (ג) を表し、ロシア語のエンコードでは別の記号を表します。しかし、いずれにせよ、これらすべての符号化方法において、0 ~ 127 で表されるシンボルは同じであり、唯一の違いはセクション 128 ~ 255 です。
アジア諸国の文字に関しては、さらに多くの記号が使用されており、その数は 10 万もの漢字に及びます。 1 バイトでは 256 個のシンボルしか表現できませんが、これでは明らかに不十分であり、1 つのシンボルを表現するには複数のバイトを使用する必要があります。たとえば、簡体字中国語の一般的なエンコード方式は GB2312 で、中国語の文字を表すのに 2 バイトを使用するため、理論的には最大 256 x 256 = 65536 個の記号を表現できます。
中国語のエンコーディングの問題については、特別な記事で説明する必要がありますが、このノートでは取り上げません。ここで指摘するのは、記号を表すために複数のバイトが使用されますが、GB クラスの中国語文字エンコーディングは、後述する Unicode および UTF-8 とは何の関係もありません。
3. Unicode
前のセクションで述べたように、世界には多くのエンコード方法があり、同じ 2 進数を使用することもできます。さまざまな記号に解釈されます。したがって、テキスト ファイルを開く場合は、そのエンコード方法を知っておく必要があり、間違ったエンコード方法で解釈すると文字化けが発生します。メールがよく文字化けするのはなぜですか?これは、送信者と受信者が異なるエンコード方式を使用しているためです。
世界中のすべてのシンボルを含むコーディングが存在すると考えられます。各シンボルには固有のコードが与えられるため、コード化けの問題は解消されます。これは、その名前が示すように、すべての記号のエンコードである Unicode です。
Unicode はもちろん大規模なコレクションであり、現在 100 万を超えるシンボルを保持できます。各記号のエンコードは異なります。たとえば、U 0639 はアラビア文字の Ain を表し、U 0041 は英語の大文字 A を表し、U 4E25 は漢字の Yan を表します。特定の記号対応表については、unicode.org または特殊な漢字対応表を確認できます。
4. Unicode の問題
Unicode は単なるシンボル セットであり、シンボルのバイナリ コードを指定するだけであることに注意してください。ただし、このバイナリ コードをどのように保存するかについては仕様がありません。
たとえば、漢字「燕」の Unicode は 16 進数 4E25 で、これを 15 桁の 2 進数 (100111000100101) に変換すると、この記号の表現には少なくとも 2 バイトが必要になります。他の大きなシンボルを表すには、3 バイトまたは 4 バイト、あるいはそれ以上のバイトが必要になる場合があります。
ここには 2 つの重大な問題があります 最初の質問は、Unicode と ASCII をどのように区別するかということです。コンピュータは、3 バイトが 3 つの別々のシンボルではなく 1 つのシンボルを表すことをどのようにして認識するのでしょうか? 2 番目の問題は、英語の文字を表すには 1 バイトだけで十分であることがすでにわかっているということです。Unicode で各記号が 3 バイトまたは 4 バイトで表現されると統一的に規定されている場合、各英語文字の前には 2 文字が必要です。3 バイトは 0、これはストレージの膨大な無駄であり、テキスト ファイルのサイズは 2 倍または 3 倍大きくなり、これは容認できません。
それらが引き起こす結果は、: 1) Unicode の複数の保存方法が登場しました。これは、Unicode を表現するために使用できるさまざまなバイナリ形式が存在することを意味します。 2) Unicode は、インターネットが出現するまで長い間普及することができませんでした。
5. UTF-8
インターネットの普及により、統一されたエンコード方式の出現が強く求められています。 UTF-8 は、インターネット上で最も広く使用されている Unicode 実装です。他の実装には、UTF-16 (文字は 2 バイトまたは 4 バイトで表される) や UTF-32 (文字は 4 バイトで表される) などがありますが、これらはインターネットではほとんど使用されません。繰り返しますが、ここでの関係は、UTF-8 が Unicode の実装であるということです。
UTF-8 の最大の特徴の 1 つは、可変長エンコード方式であることです。シンボルを表すのに 1 ~ 4 バイトを使用でき、バイト長はシンボルによって異なります。
UTF-8 のエンコード規則は非常に単純で、次の 2 つだけです:
1. シングルバイト記号の場合、バイトの最初のビットが設定されますから 0、および次の 7 ビットは、このシンボルの Unicode コードです。したがって、英語の文字の場合、UTF-8 エンコードと ASCII エンコードは同じです。
2. n バイトのシンボル (n > 1) の場合、最初のバイトの最初の n ビットは 1 に設定され、n 番目の 1 ビットは 0 に設定され、次のバイトの最初の 2 ビットはバイトは 1 に設定されます。常に 10 に設定されます。言及されていない残りの 2 進ビットはすべて、このシンボルの Unicode コードです。
次の表は、エンコード ルールをまとめたものです。文字 x は、使用可能なエンコード ビットを示します。
#上記の表によると、UTF-8 エンコーディングの解釈は非常に簡単です。バイトの最初のビットが 0 の場合、そのバイトだけが文字です。最初のビットが 1 の場合、連続する 1 の数は、現在の文字が占めるバイト数を示します。
次に、漢字の「燕」を例として、UTF-8 エンコーディングを実装する方法を示します。
Yan の Unicode は 4E25 (100111000100101) です。上の表によると、4E25 は 3 行目 (0000 0800 - 0000 FFFF) の範囲にあることがわかりますので、Yan の UTF-8エンコードには 3 バイトが必要です。つまり、形式は 1110xxxx 10xxxxxx 10xxxxxx です。次に、Yan の最後の 2 進数から始めて、形式の x を後ろから前に埋め、余分なビットを 0 で埋めます。このようにして、Yan の UTF-8 エンコーディングは 11100100 10111000 10100101 であることがわかり、16 進数に変換すると E4B8A5 になります。
6. Unicode と UTF-8 の間の変換
前のセクションの例から、Yan の Unicode コードが 4E25 であることがわかります。 , UTF-8エンコーディングはE4B8A5であり、この2つは異なります。それらの間の変換はプログラムを通じて実現できます。
Windows プラットフォームの場合、最も簡単な変換方法の 1 つは、組み込みのメモ帳アプレット notepad.exe を使用することです。ファイルを開いた後、[ファイル] メニューの [名前を付けて保存] コマンドをクリックすると、ダイアログ ボックスが表示され、下部にコーディング ドロップダウン バーが表示されます。
ANSI、Unicode、Unicode ビッグ エンディアン、UTF-8 の 4 つのオプションがあります。
7. リトル エンディアンとビッグ エンディアン
前のセクションで説明したように、UCS-2 形式は Unicode コード (コード ポイント) を保存できます。 0xFFFFを超えない)。漢字のヤンを例にとると、Unicode コードは 4E25 で、1 バイトが 4E、もう 1 バイトが 25 の 2 バイトで格納する必要があります。格納する場合、前に4E、後ろに25が来るビッグエンディアン方式と、前に25、後ろに4Eが来るリトルエンディアン方式があります。これら 2 つの奇妙な名前は、イギリスの作家スウィフトの「ガリバー旅行記」に由来しています。この本の中で、リリパットで内戦が勃発しましたが、その原因はビッグエンディアンとリトルエンディアンのどちらからエッグを割るかをめぐる人々の争いでした。この事件により六度の戦争が勃発し、一人の皇帝が命を落とし、また一人の皇帝が王位を失った。
最初のバイトが最初に来る「ビッグ エンディアン」、2 番目のバイトが最初に来る「リトル エンディアン」です。
したがって、当然のことながら、次のような疑問が生じます。コンピュータは、特定のファイルがどの方法でエンコードされているかをどのようにして知るのでしょうか?
Unicodeの仕様では、各ファイルの先頭にエンコード順序を示す文字を付加することが定められており、この文字の名前は「ゼロ幅ノーブレークスペース」(ゼロ幅ノーブレークスペース)と呼ばれます。代表はFEFF。これはちょうど 2 バイトであり、FF は FE より 1 大きい値です。
テキスト ファイルの最初の 2 バイトが FE FF の場合は、ファイルがビッグエンド モードを使用していることを意味し、最初の 2 バイトが FF FE の場合は、ファイルがスモールエンド モードを使用していることを意味します。
8. 例
以下に例を示します。
「メモ帳」プログラム notepad.exe を開き、新しいテキスト ファイルを作成します。内容は厳密文字で、ANSI、Unicode、Unicode ビッグ エンディアン、および UTF-8 エンコードで保存します。
次に、テキスト編集ソフトウェア UltraEdit の「hex 関数」を使用して、ファイルの内部エンコーディングを観察します。
ANSI: ファイルのエンコードは 2 バイトの D1 CF で、これは厳密な GB2312 エンコードであり、GB2312 がビッグ ヘッド モードで保存されていることも意味します。
Unicode: エンコードは 4 バイト FF FE 25 4E です。FF FE はスモール ヘッド モードで格納されていることを示し、実際のエンコードは 4E25 です。
Unicode ビッグ エンディアン: エンコードは 4 バイト FE FF 4E 25 で、FE FF はビッグ エンディアン ストレージを示します。
UTF-8: エンコードは 6 バイト EF BB BF E4 B8 A5 です。最初の 3 バイト EF BB BF は、これが UTF-8 エンコードであることを示し、最後の 3 バイトはE4B8A5. Yan 固有のエンコーディング、その格納順序はエンコーディング順序と一致します。
#9. 多読 (課外知識)##すべてのソフトウェア開発者が絶対に、確実に Unicode について知っておくべき絶対最低限の知識および文字セット (文字セットに関する最も基本的な知識)
Unicode エンコードについて説明します: RFC3629: ISO 10646 の変換形式である UTF-8 (UTF-8 の規制が実装されている場合)
以上が文字セットのエンコーディングである ASCII、Unicode、UTF-8 についてどれくらい知っていますか?文字セットエンコーディングの概要 (コレクション)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。