中国とはかなり理解していないフォーマットをエンコードする文字列表示異なる文字セットのWindowsプラットフォームでは、以前のプログラムで。使用に簡単な操作を行うために、その後、独自の分析や参考資料を通じて、知識のこの部分の製造に使用される最近のデータは、のコーディング中国の一般的なコーディングのセットと一緒に分析してみましょう!
章プレビュー:
1.中国の文字配列は、コーディングGB2312を保存
2.GB2312標準
3.出力歪み原理
エンコード4.整数ストア中国のGB2312
5.Uncode
6.UTFを。8
7.整数ストアUTF-8でエンコードされた中国
章:
GB2312中国語の文字エンコーディングストレージアレイ:
最初の文字"こんにちは"、参照コードによって、我々配列出力:
unsigned char型のtestch = {0}; [4]
のmemcpy(testch、 "こんにちは"、strlenを( "こんにちは"));
のprintf(「%のS | 」、testch)。
結果は次のとおりです。あなたの熱い暑い暑い暑いです
|
まず、私たちは情報testch出力を分析:
我々は、文字値の256バイトの配列が格納されている定義testch:
unsigned char型のtestch2 [256] = {0};
;のmemcpy(testch2、testch、255)
:testch2展開
testch2 0x00aff9f0 "あなたは、ホットホットホットプレス-
[" unsigned char型を256]
[0] 196 '?'はunsigned char
[1] 227 '?'はunsigned char
[2] 186 '?'はunsigned char
[3] 195 '?'はunsigned char
[4] 204 '?'はunsigned char
[5] 204 '?'はunsigned char
[6] 204 '?'はunsigned char
[7] 204 '?'はunsigned char
[8] 204 '?'はunsigned char
[9] 204 '?'はunsigned char
[10] 204 '?'の符号なしチャー
[11] 204 '?'はunsigned char
[12である] 10 '
'はunsigned char
[13] 0はunsigned char
Byte13値0は、プログラムからtestch情報出力は、ここで終了します。
その後、我々は情報コンテンツtestch出力を分析します:
所定のマッチング2を用いてGB2312は(不一致GB2312標準)ことコンパイラはVS2010ようにしてもよい、文字表現あたりのバイト数
、0から128バイトの現在値、国際Ascllの使用は、コードテーブルとして計算します現在のバイトの情報を対応する文字コードテーブルAscllに表示され、
現在のバイト値が129以上である、現在のバイトの1バイトに続いては、2つのバイトを使用してコードマッチGB2312(あると考えられているビットの数にマージデジタル値はGB2312エンコーディング内にない場合は16桁(下位バイトの下位8ビット、上位バイトの8ビット))、GB2312で符号化されたデジタル値場合、GB2312対応情報は、単一のように)(そうでない場合、表示されますバイト表示。
GB2312規格:
GB2312は、簡体字中国語の文字のための主要な公式の中国の文字セットの登録名です。GBは1981年5月1日に開始、1980年に中国国家標準局によって発行され、国の基準と略します。GB2312エンコーディングは、前記漢字3755、2つの文字3008、6763文字の合計が含まれています。
各文字に対して所定GB2312が2つのバイトを使用して含まれ、最初のバイトは、領域94に対応し、「高」であり、2番目のバイトは94ビットに対応し、「低」であり、 0101-9494:それは市外局番の範囲です。桁のエリアコードと番号、それぞれ、プラス0xA0をはGB2312エンコーディングです。最後の例は、9494ビットのコード、エリアコード及びコードビットがGB2312 FEFEに符号化されるように、各ビット数は、0x5Eの+ 0xA0を= 0xFEの16進5E5Eに変換されます。
GB2312コード範囲0xA1A1-0xFEFE、前記0xB0A1-0xF7FE、最初のバイト0xB0-0xF7は(コードに対応する:16--87)文字の符号化範囲、第二のバイト0xA1-0xFE(ビット数に対応します:01- 94)。
出力文字化けの理由:
私たちは、店舗情報の文字列を使用し、文字列(最後のバイト・キャラクタ・セットが空である)の終わりをしなかった場合は、状況は、「メモリアクセスオフサイド」を発生しますスタックメモリスペースVS2010コンパイラが自動的に使用されていないため、すべての2つのバイトが「ホット」の文字をコードGB2312として示さ0xCCを、ある0xCC(符号なし204)バイト初期化。
GB2312中国の店舗整数コード:
符号なしshort:
:32ビットのコンパイラで、符号なしのタイプ短い2バイト、我々は、「こんにちは」、符号なしの短い配列によってデータを保存して出力することができ
、符号なしの短いSHOを= {} 58308,50106,0 [3]
(のprintf 「%s」は、翔);
最初の値:58308 1110は、バイナリデジタル0011,1100 0100、中国の「君」に変換され、
第2の値を:50106 1110がバイナリデジタル0011,1011 1010中国語「良好に変換されます「;
三値:NULL文字として使用します。
数字列:左、右よりも高いです。
unsigned int型:
32ビットコンパイラ、unsigned int型に4バイト、出力"ハロー":
unsigned int型のSHO [2] = {} 3283805124,0;
;のprintf( "%のS"、SHO)
最初の値:3283805124を2進数に変換される110000111011 001111000100 1010 1110中国の「ハロー」;
第二値:NULL文字として。
グループ内の右の順に、左に2つのバイトを2バイト、バイト3,4(中国の「良い」)のセットを使用して(中国語「あなたを」)unsigned int型のGB2312のデータストレージを使用している場合です右よりも左。
長い長いです:
ほとんどのコンパイラでは、タイプは長い長い"あなたは大丈夫"出力、8つのバイトを占め:
長い長いSHO = 208708629619652;
のprintf( "%のS"、&SHO);
パラメータ:208,708,629,619,652または六角0xBDD1C3BAE3C4 2進数に変換されます
101111011101 0001,1100 00111011 001111000100 1010年、1110年、中国の「大丈夫」。
使用する場合、長い長い、GB2312格納されたデータ・タイプを入力フォームと同じINTを格納します。私達は例の出力文字GB2312 3、6、7、使用バイトのヌル文字。
ここでは、出力シンボルのunsigned型と結果タイプの使用が同じであることを見ることができ、利便性のみ符号なしの参照データのために使用される例のほとんど。
Uncode:
異なる国や地域による非Unicode環境では、文字セットを使用することは、すべての文字場合は正しく表示されない可能です。この問題を解決するために移行部に、Microsoftのコードページ(コードページ)変換テーブルを用いた技術は、即ち、非Unicode文字エンコーディングによって指定変換テーブルは、同一の内部システムの使用をコードする対応するUnicode文字に変換されます。
MultiByteToWideCharのウィンドウAPIの文字列にワイド文字(Unicode文字)の文字列をマップする関数です。
UTF-8:
UTF-8は、Unicode標準に任意の文字を表すために使用することができるUnicodeの可変長の文字エンコーディングであり、1〜4オクテットの可変数のそれぞれをコードするUnicodeのUTF-8文字前記オクテットの数が整数値に割り当てられたUnicode文字に依存します。これは、各文字がU +内の1つのオクテットとして表現される間、それはU + 007Fに0000の範囲であるため、Unicodeの文書US-ASCII文字の効率的な符号化が主に使用されています。
中国の整数ストアUTF-8エンコーディング:
長い長いです:
そのため不確実バイトUTF-8文字セットの、直接「こんにちは」を出力long long型:
システム(「CHCP 65001」); // VS2010のコンパイラでは、我々は、コンソールへの出力情報を選択するUTF-8
SHO = 208520219770340ロングロング;
のprintf( "%のS"、&SHO);
パラメータ:208,520,219,770,340又はヘクス0xBDA5E5A0BDE4をバイナリに変換される
番号:1011 1101 1010 1,010,010,111,100,101 0,000,101,111,011,110 0100中国語」 「こんにちは。
「あなた」の例として、「良い」は、それぞれ3バイト、6,5,4バイト(中国語「良い」)右とグループで左に、3,2,1バイト(中国語「あなた」)を占めます高低位も左右。