徹底的に文字コードを明らかにする:ASCII、Unicode、UTF-8、GBK間の連絡の違い

5340 ワード

早速作業に入りましたが、今日Classファイルの構造を復習する際、UTF-8のサムネイルコードについてお話しします。以前はASCII、UTF-8、Unicodeなどのコードがあいまいだったので、今日は自分の勉強の心得を共有します。分かりやすい考えで、ブログを書きます。

  • まず文字コードが必要な理由を明らかにする
  • コンピュータ内部では,すべての情報は0と1のようなバイナリ文字列で表される.文字「A」をコンピュータに格納する必要がある場合、どの状態に対応すればいいのでしょうか.格納する場合、文字「A」を01000010(この任意に編成された)バイナリ文字列で表し、コンピュータに格納することができます.読み込み時に01000010を文字'A'に復元します.では、問題が来ました.記憶するとき、文字「A」はどのバイナリ数に対応すべきですか.01000010ですか.それとも1000000 11110101ですか?はっきり言って、ルールが必要です.このルールは、文字を一意の状態(バイナリ文字列)にマッピングすることができます.これが符号化です.最初に出現した符号化規則はASCII符号化であり、ASCII符号化規則では、文字'A'は01000010にも1000 0000 11110101にも対応せず、01000001にも対応する.
    説明文字符号化とは,コンピュータが認識していない情報をコンピュータが認識するバイナリ文字にマッピングすることである.

    一、ASCIIコード


    コンピュータ内部では、すべての情報が最終的にバイナリ値であることを知っています.各バイナリビット(bit)には01の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である.
  • ここでこれらの関係をまとめる
  • ASCIIは英語のアルファベットのマッピング関係を完了しただけで、Unicodeは文字セットにすぎず、アルファベットのバイナリコードを規定しているが、文字をどのように保存するかは規定されていない.
    UTF-8は可変長符号化であり、1文字を1~4バイトで表すことができ、異なる文字に応じて異なるバイト長を用いることができる.GBKは漢字の符号化を容易にするために制定された符号化方式である.皆さんの交流を歓迎します.