徹底的に文字コードを明らかにする:ASCII、Unicode、UTF-8、GBK間の連絡の違い
5340 ワード
早速作業に入りましたが、今日Classファイルの構造を復習する際、UTF-8のサムネイルコードについてお話しします。以前はASCII、UTF-8、Unicodeなどのコードがあいまいだったので、今日は自分の勉強の心得を共有します。分かりやすい考えで、ブログを書きます。
説明文字符号化とは,コンピュータが認識していない情報をコンピュータが認識するバイナリ文字にマッピングすることである.
一、ASCIIコード
コンピュータ内部では、すべての情報が最終的にバイナリ値であることを知っています.各バイナリビット(bit)には
0
と1
の2つの状態があるため、8つのバイナリビットは256種類の状態を組み合わせて1バイト(byte)と呼ぶことができる.すなわち、1バイトは256種類の異なる状態を表すために使用することができ、各状態は256個の記号に対応し、00000000
から11111111
までSPACE
である.前世紀60年代、米国は文字コードを制定し、英語の文字とバイナリビットの関係を統一的に規定した.これはASCIIコードと呼ばれ、現在まで使われています.
ASCIIコードは128文字の符号化を規定しており、例えばスペース
00100000
は32(バイナリA
)、大文字のアルファベット01000001
は65(バイナリ0
)である.この128個の記号(印刷できない32個の制御記号を含む)は、1バイトの後7ビットのみを占有し、一番前の1ビットはé
と統一的に規定されている.二、非ASCII符号化
英語は128個の記号で符号化すれば十分ですが、他の言語を表すには128個の記号では足りません.例えば、フランス語ではアルファベットの上に注音記号があり、ASCIIコードでは表現できません.そこで、一部のヨーロッパ諸国では、バイトにアイドルの最高位を利用して新しい記号を組み込むことにした.例えば、フランス語における
10000010
の符号化は130(バイナリé
)である.このように、これらのヨーロッパ諸国で使用される符号化システムは、最大256個の記号を表すことができる.しかし、ここでまた新たな問題が発生した.異なる国には異なるアルファベットがあるので、256個の記号の符号化方式を使っても、代表するアルファベットは違います.例えば、130はフランス語符号化で
Gimel
を表し、ヘブライ語符号化ではアルファベットג
(U+0639
)を表し、ロシア語符号化では別の記号を表す.しかし、いずれにしても、これらの符号化方式のうち、0〜127で表される記号は同じであり、異なるのは128〜255のセグメントにすぎない.アジアの国の文字については、使用する記号が多くなり、漢字は10万前後に達した.1バイトは256種類の記号しか表示できません.足りないに違いありません.複数のバイトで1つの記号を表現する必要があります.例えば、簡体字中国語の一般的な符号化方式はGB 2312で、1つの漢字を2バイトで表すため、理論的には256 x 256=65536個の記号を表すことができる.
中国語のコードの問題は専門的な議論が必要で、このノートは関連していません.ここでは,いずれも1つの符号を複数バイトで表しているが,GBクラスの漢字符号化は後文のUnicodeやUTF-8とは無関係であることを指摘する.
三.Unicode
前節で述べたように、世界には複数の符号化方式が存在し、同じバイナリ数字を異なる記号として解釈することができる.そのため、テキストファイルを開くには、その符号化方式を知らなければならない.そうしないと、誤った符号化方式で解読され、文字化けしてしまう.なぜ電子メールに文字化けしがしばしば発生するのですか?送信者と受信者が使用する符号化方式が異なるからである.
一つの符号化があれば、世界のすべての記号を組み込むことが想像できる.各記号にユニークな符号化を与えると、文字化の問題は消えてしまいます.これがUnicodeで、名前が表示されているように、これはすべての記号の符号化です.
Unicodeはもちろん大きな集合で、現在の規模では100万個以上の記号を収容することができます.各記号の符号化は異なる.例えば、
Ain
はアラビア文字U+0041
を表し、A
は英語の大文字U+4E25
を表し、
は漢字
を表す.具体的なシンボル対応テーブルはunicodeをクエリーすることができる.org、または専門の漢字対応表.四、Unicodeの問題
Unicodeはシンボルセットにすぎず、シンボルのバイナリコードのみを規定しているが、このバイナリコードがどのように格納されるべきかは規定されていないことに注意してください.
例えば、漢字
4E25
のUnicodeは16進数100111000100101
であり、2進数に変換するには15ビットもある(0
)、つまり、この記号の表示には少なくとも2バイトが必要である.他のより大きな記号を表すには、3バイト以上、4バイト以上が必要になる場合があります.ここには2つの深刻な問題があります.最初の問題は、UnicodeとASCIIをどのように区別するかです.コンピュータはどうして3バイトが1つの記号を表すことを知っていて、それぞれ3つの記号を表すのではありませんか?2つ目の問題は、英語のアルファベットが1バイトで十分であることを知っています.Unicodeが統一的に規定している場合、各記号が3バイトまたは4バイトで表されると、英語のアルファベットの前に必ず2~3バイトが
0
になります.これは記憶にとって大きな浪費であり、テキストファイルの大きさは2、3倍になります.これは受け入れられません.これらの結果,1)Unicodeを表すために使用できる複数のバイナリフォーマット,すなわち,Unicodeを表すために使用できる複数の異なるバイナリフォーマットが出現した.2)Unicodeはインターネットが登場するまで長い間普及できなかった.
五、UTF-8
インターネットの普及は、統一的な符号化方式の出現を強く要求している.UTF-8はインターネット上で最も広く使われているUnicodeの実現方式である.他の実施形態は、UTF−16(文字は2バイトまたは4バイトで表される)およびUTF−32(文字は4バイトで表される)を含むが、インターネット上ではほとんど用いられない.繰り返しますが、ここでの関係は、UTF-8がUnicodeの実現方式の一つです.
UTF-8の最大の特徴は、長くなる符号化方式である.1~4バイトで1つのシンボルを表し、異なるシンボルに応じてバイト長を変化させることができる.
UTF-8の符号化規則は簡単で、2つしかありません.
1)バイトの符号に対してバイトの第1ビットを
n
とし,後の7ビットをこの符号のUnicode符号とする.したがって、UTF-8符号化は、英字ではASCII符号と同じである.2)
n > 1
バイトの符号(n
)については、1バイト目の前1
ビットはいずれもn + 1
とし、第0
ビットは10
とし、後バイトの前2ビットはすべてx
とする.残りの言及されていないバイナリビットは、すべてこの記号のUnicodeコードである.次の表は、使用可能な符号化のビットを表す符号化規則をまとめたものである.
Unicode | UTF-8
( ) | ( )
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
上の表によると、UTF-8コードを解読するのは簡単です.1バイトの最初のビットが
0
である場合、このバイトは単独で1文字である.1番目のビットが1
である場合、1
が連続して何個あるかは、現在の文字が何バイトを占有しているかを示す.以下、漢字
を例に、UTF-8符号化の実現方法を示す.
のUnicodeは4E25
(100111000100101
)であり、上記の表によれば4E25
が3行目の範囲内にあることがわかる(0000 0800 - 0000 FFFF
)ため、
のUTF-8符号化には1110xxxx 10xxxxxx 10xxxxxx
のフォーマットが必要である.そして、
の最後のバイナリビットから順に後から順にフォーマット中のx
を記入し、より多くのビット補完0
を記入する.これにより,
のUTF-8符号化は11100100 10111000 10100101
であり,16進法に変換するとE4B8A5
である.UTF-8は可変長符号化であり、1文字を1~4バイトで表すことができ、異なる文字に応じて異なるバイト長を用いることができる.GBKは漢字の符号化を容易にするために制定された符号化方式である.皆さんの交流を歓迎します.