iOS開発ノートのUTF 8コード


今日、ブロガーは文字のトランスコードの需要があって、いくつかの困難な点に出会って、ここでみんなと分かち合って、共に進歩することを望んでいます.
以下は個人の総括で、必要なものがあれば参考にすることができます.
  • ASCIIコード
  • コンピュータ内部では、すべての情報が最終的にバイナリ文字列として表されることを知っています.各バイナリビット(bit)には0と1の2つの状態があるため、8つのバイナリビットは256の状態を組み合わせて1バイト(byte)と呼ぶことができる.すなわち、1バイトは256種類の異なる状態を表すために使用することができ、各状態は256個の記号に対応し、00000000から11111111までの256個の記号である.
    前世紀60年代、米国は文字コードを制定し、英語の文字とバイナリビットの関係を統一的に規定した.これはASCIIコードと呼ばれ、現在まで使われています.
    ASCIIコードは128文字の符号化を規定しており、例えばスペース「SPACE」は32(バイナリ0010000000)、大文字のAは65(バイナリ01000001)である.この128個の記号(印刷できない32個の制御記号を含む)は、1バイトの後ろ7ビットのみを占有し、一番前の1ビットは0に統一されている.
    2、非ASCII符号化
    英語は128個の記号で符号化すれば十分ですが、他の言語を表すには128個の記号では足りません.例えば、フランス語ではアルファベットの上に注音記号があり、ASCIIコードでは表現できません.そこで、一部のヨーロッパ諸国では、バイトにアイドルの最高位を利用して新しい記号を組み込むことにした.例えば、フランス語のéの符号化は130(バイナリ10000010)である.このように、これらのヨーロッパ諸国で使用される符号化システムは、最大256個の記号を表すことができる.
    しかし、ここでまた新たな問題が発生した.異なる国には異なるアルファベットがあるので、256個の記号の符号化方式を使っても、代表するアルファベットは違います.例えば、130はフランス語の符号化でéを表し、ヘブライ語の符号化ではアルファベットGimel(ג),ロシア語の符号化ではもう一つの記号を表します.しかし、いずれにしても、これらの符号化方式のうち、0〜127が表す記号は同じであり、異なるのは128〜255のセグメントにすぎない.
    アジアの国の文字については、使用する記号が多くなり、漢字は10万前後に達した.1バイトは256種類の記号しか表示できません.足りないに違いありません.複数のバイトで1つの記号を表現する必要があります.例えば、簡体字中国語の一般的な符号化方式はGB 2312であり、2バイトで1つの漢字を表すため、理論的には256 x 256=65536個の記号を表すことができる.
    中国語のコードの問題は専門的な議論が必要で、このノートは関連していません.ここでは,いずれも1つの符号を複数バイトで表しているが,GBクラスの漢字符号化は後文のUnicodeやUTF-8とは無関係であることを指摘する.
    3.Unicode
    前節で述べたように、世界には複数の符号化方式が存在し、同じバイナリ数字を異なる記号として解釈することができる.そのため、テキストファイルを開くには、その符号化方式を知らなければならない.そうしないと、誤った符号化方式で解読され、文字化けしてしまう.なぜ電子メールに文字化けしがしばしば発生するのですか?送信者と受信者が使用する符号化方式が異なるからである.
    一つの符号化があれば、世界のすべての記号を組み込むことが想像できる.各記号にユニークな符号化を与えると、文字化の問題は消えてしまいます.これがUnicodeで、名前が表示されているように、これはすべての記号の符号化です.
    Unicodeはもちろん大きな集合で、現在の規模では100万個以上の記号を収容することができます.各記号の符号化は異なり、例えば、U+0639はアラビア文字Ain、U+0041は英語の大文字A、U+4 E 25は漢字「厳」を表す.
  • Unicodeの問題
  • Unicodeはシンボルセットにすぎず、シンボルのバイナリコードのみを規定しているが、このバイナリコードがどのように格納されるべきかは規定されていないことに注意してください.
    例えば、漢字の「厳」のunicodeは16進数4 E 25で、2進数に変換するには15ビット(100111000100101)、つまりこの記号の表示には少なくとも2バイトが必要です.他のより大きな記号を表すには、3バイト以上、4バイト以上が必要になる場合があります.
    ここには2つの深刻な問題があります.最初の問題は、UnicodeとASCIIをどのように区別するかです.コンピュータはどうして3バイトが1つの記号を表すことを知っていて、それぞれ3つの記号を表すのではありませんか?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~4バイトで1つのシンボルを表し、異なるシンボルに応じてバイト長を変化させることができる.
    UTF-8の符号化規則は簡単で、2つしかありません.
    1)バイトのシンボルについては,バイトの第1ビットを0とし,後7ビットをこのシンボルのunicodeコードとする.したがって、UTF-8符号化は、英字ではASCII符号と同じである.
    2)nバイトの符号(n>1)については,1バイト目の前nビットがいずれも1,n+1ビット目が0,後バイトの前2ビットが一律に10とする.残りの言及されていないバイナリビットは、すべてこの記号のunicodeコードです.
    6.GB2312
    ANSI符号化の一種で、ASNI符号化の最も初期のASCII符号化を拡張し、国内でコンピュータで漢字を使用する需要を満たすために、中国国家標準総局は一連の漢字文字集国家標準符号を発表し、総称してGB符号、または国標符号と呼ばれている.中でも最も影響を受けたのは1980年に発表された「情報交換用漢字符号化文字セット基本セット」で、標準番号はGB 2312-1980で、その使用が非常に一般的であるため、通称は国標コードとも呼ばれている.GB 2312は、6763個の常用漢字と682個の全角の非漢字文字からなる簡体字中国語文字セットである.GB 2312符号化は1つの漢字を2バイトで表すので、理論的には256 x 256=65536の漢字を表すことができる
    7.GBK
    漢字内コード拡張規範、Kは拡張した中国語ピンインの中の「拡張」字の音母である.GBKはGB 2312と互換性があり、漢字21003個、記号883個を収録し、1894個の造字符号ビットを提供する.
    8.Cocoaにおける関連技術点iOSにおける文字列のUTF-8符号化:str文字列を出力するUTF-8フォーマット
    [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    復号:str文字列をUTF-8ルールで復号する
    [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    サーバ上の符号化がgbkであれば:
    NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    
    NSString *giftString = [NSString stringWithContentsOfURL:giftUrl encoding:gbkEncoding error:&error];

    原文リンク:IOS開発ノートのUTF 8コード関連