文字セットに関する概念
文字セット&エンコーディング
charsetはcharacter setの略、すなわち文字セットである. encodingはcharset encodingの略、すなわち文字セット符号化、略称符号化である. 番号付け
文字番号符号化番号は、具体的に何バイトを使用して表すか、定長または変長スキームを使用するかなどの詳細な問題には関与しない.番号は抽象的な概念にすぎず、具体的な文字を唯一のcodeにマッピングすることは、文字をデジタル化するプロセスです. 文字セットは、マッピング関係[文字-番号]のセットであり、すなわち、文字のデジタル化抽象であるが、具体的な符号化変換フォーマットは示されない.Unicodeは文字セットです. 符号化は番号の具体的な記憶方式であり、抽象的な番号を具体的な符号化-符号化対応[記憶バイト数、長くなるかどうか...]に変換する 具体的にUnicodeについて説明します
Unicode文字セット
UnicodeはUnicode Standard(Unicode規格)の略であるため、UnicodeはUnicode規格を指す. 特定のプラットフォーム、言語から離れ、各文字に一意の数字であるコードポイントを与えます.
コードポイントのフォーマットU+[XX]XXXX X:
は4-6ビットで、4ビット未満の前補0は4ビットを補充し、超えると数ビットで数ビットになります.具体例: U+0048(4位前補0未満) U+4F60 U+1 D 11 E(4ビットを超えると実桁) の範囲[U+0000,U+10 FFFF]理論サイズは10 FFFF+1=10000(16進)であり、百万級の数である.10FFFF + 1 = 110000(16) = (16 + 1) * FFFF = 17 * 16^4 = 17 * 65536(10)
17 FFFF
平面[plane]このような膨大な符号点数をよりよく分類管理するために、65536個の符号点ごとに1つの平面として、合計17個の平面がある.最初の平面はBMP(Basic Multilingual Plane基本多言語平面)と呼ばれ、Plane 0とも呼ばれ、その符号点範囲はU+0000~U+FFFF である.
以降の16個の平面をSP(Supplementary Planes)と呼ぶ.範囲がU+FFFFを超える、すなわち2つのbyte=16 bit(2^16)個を超える理論上限.
CJK統一漢字(CJK:Chinese,Japanese,and Korean,中日韓)はfirst planeの真ん中に大きなエリア [\u4E00-\u9FA5] plane 0 Unicode , 。
エージェント領域BMPには、D 8~DFからなる空白が残っている.ここで、前面D 800−DFFはハイエージェント領域(High Surrogate Area)に属し、背面のDC 00−DFFはローエージェント領域(Low Surrogate Area)に属し、それぞれのサイズは4である×256(2^8)=1024の2つの領域が2次元の表を構成し、1024×1024=210×210=24×216=16×65536なので、補完された16の平面のすべての文字を表すことができます. Lead, Trail,
,
:
(D8 00 DC 00)—>U+10000, ,
(DB FF DF FF)—>U+10FFFF, ,
Unicodeの具体的な符号化フォーマット
3つの符号化スキームの定変長とバイト数のまとめ:
UTF-8:長くなり、1-4バイトになります. UTF-16:長くなり、2または4バイトになります. UTF-32:定長、4バイト. 定長と変長
は容量と効率の間の全行で、長くなる符号化スキームが現れた. が長くなる設計の核心は異なる長くなるバイトを区別することにある:高位区分を利用して、エージェント区区分を利用する
デフォルト表示ビット(高位で区別)の変長スキームは、多くの有効符号ビットを失う.
エージェント領域を区別するスキーム(code【70-80】配列の一部を保持し、70*80 100 codeをマッピングする).
具体的なエンコーディング実装
UTFはUnicode変換フォーマット(Unicode(or UCS)Transformation Format)である
UTF-32 符号点最大の10 FFFFは21ビットを占め、UTF-32が採用する定長4 byteは32ビットである.高位補0の形式は32ビットを補うだけでよく、欠点はスペースが大きすぎる. 4バイトXXXX、XXXX XXXX、XXXX XXXX、XXXX XXXX、XXXX XXXX UTF-8 が長くなる符号化スキーム:1,2,3,4の4種類のbyte組合せ高位保持方式を採用して異なる長さを区別する 1バイト0 XXX XXXX(7)2バイト110 X XXX 10 XX XXXX)(11) 3バイト1110 XXXX 10 XX XXXX 10 XX XXXX 10 XX XXXX(16) 4バイト1111 0 XXX 10 XX XXXX 10 XX XXXX 10 XX XXXX 10 XX XXXX(21) 符号点対応バイト符号化トランスバイナリ数、上位0を除く判定は数バイトを用いる.
バイト有効ビット7ビット(2^7=128)互換ASCII、[コードポイント]U+0000~U+007 F(0~127)バイト11ビット有効、2^11=2048個の符号化空間符号点U+0080~U+07 FF(128~20447)は1バイトの符号点を除く、二直接符号点は128~20447なので、2048個の符号化空間を満たすことはなく、冗長性があり、以下同様にである.
3バイト16ビット有効、65536個の符号化空間符号点U+0800~U+FFFF(2048~65535)同様3バイト符号点範囲U+0800~U+FFFF(2048~65535).
にはほとんどの漢字(常用字)が保存されており、増補平面に保存されている偏門漢字も多い.
バイト残り21ビット有効ビット数、最大のUnicodeコードポイント10 FFFF(1+4*5)も21ビットで、ちょうどカバーしています.U+FFFF以上の補完平面の文字はすべてここでを表す.
UTF-8のモードに従って、それはまた5バイトまで拡張することができて、甚だしきに至っては6バイトは長くなりますが、Unicodeはコードポイントを言って10 FFFFに着いて、拡張しないで、だからUTF-8は最大で4バイトまで十分です 符号点をUTF-8符号化に変換符号点を2進に変換する.
バイナリ数をUTF-8に従ってパケットを固定する.
数バイトモードを選択すると、上位は0 に不足します.
再び2進数を16進数 “ ” (U+ 4F60)
2 :U+ 4F60 -> 0100 1111 0110 0000 (16 3 )
:0100 1111 0110 0000 -> 0100 1111,01 10,0000 (3 4+6+6)
:1110 0100 1011 1101 1010 0000
16 :E4 BD A0
に変換する.
UTF-8 3バイトモードは1110の先頭モードを固定しているため、多くの漢字は常に1110で始まり、16進数形式に置き換えられ、1110はアルファベットEである.一連の16進数を見ると、EX XX XX EX XX XX…
が3バイトごとにEヘッダである場合、が漢字のUTF-8で符号化されている可能性が高い.
UTF-16 BMPの符号点は、直接対応変換不要(plane 0範囲2 byte=16 bit、16ビットがちょうど対応)が長くなる2バイトまたは4バイト符号化モード BMP内の文字は2バイト符号化を用いる.
他のものは、いわゆるエージェントペアを4バイトで構成するを符号化する.
エージェント領域鳥瞰図では、空白の領域がエージェント領域(Surrogate Area)、である.
補完平面の文字を符号化するために保持されている2048の位置は、いずれも高エージェント領域(D 800–DFF)と低エージェント領域(DC 00–DFF)の2つの部分に分けられ、各1024は、2次元のテーブルを構成し、合計:1024 × 1024 = 2^10×2^10 = 2^4×2^16 = 16×65536
補完された16の平面のすべての文字を表すことができます.
コードポイント変換 BMPで直接対応し、何の変換もしない補足平面SP:から10000(16進)[第1の平面のすべての符号点]を減算する.
をエージェント領域の行幅で割る[1024(10進)]商:第数高エージェント領域の余数:第数低エージェント領域 Lead=(コードポイント–10000(16))÷40016+D 800 Trail=(コードポイント–10000(16)%40016+DC 00 実際の変換用APIは、シフト演算によってより効率的である