GB2312是簡體中文系統的標準編碼 用“區” 跟“位”的概念表示 稱之為區位碼
區指代大的範圍 位相當於位移量。
每個漢字佔兩個位元組
高位位元組”的範圍是0xB0-0xF7,“低位位元組”的範圍是0xA1-0xFE。
它的規律好像是按拼音a到z的順序排列的
“啊”字是GB2312之中的第一個漢字,它的區位碼就是1601
為此我們現在用代碼的方式輸出一個漢字
c#下是little位元組序 b0跑後面去了。
複製代碼 代碼如下: ushort u = 0xa1b0;
byte[] chs =BitConverter.GetBytes(u);
Console.Write(Encoding.GetEncoding("GB2312").GetString(chs));
螢幕上輸出的是漢字“啊”
但是注意並不代表 寫個迴圈從0xbA1 到0xf7fe就可以輸出所有的漢字,這個很簡單比如高位從1到9 低位從1到9 只有81種組合。
並不代表99-11就是結果 這麼二的問題 暈。實際上通過這種方式漢字的個數總共是6768個,理解了區位碼的概念後你就知道怎樣去處理gb2312的漢字編碼了。
下面我們就用這種方式來輸出所有的漢字
複製代碼 代碼如下://gb2312
//B0-F7,低位元組從A1-FE
//byte hi = 0xB0;
//byte lo = 0xA1;
for (byte i = 0xB0; i <= 0xF7; i++)
{
for (byte j = 0xA1; j <= 0xFE; j++)
{
//byte t = (byte)(j | (byte)0x01);
Console.Write(Encoding.GetEncoding("GB2312").GetString(new byte[] { i, j }));
}
}
關於GB2312的解釋:http://www.jb51.net/article/34630.htm
ASCII是美國資訊交換標準碼 他是從0~127,一個位元組8位最高是255 就是說一個位元組都用不完。
GB2312裡也有字母 稱之為全形字元 ,gb2312裡也包括ascii碼稱之為半形字元。
全形字元看上去怪怪的 感覺有點不一樣 就像這樣 全形: A半形:A 全形:a 半形:a
全形字元除了在文字系統裡用到沒什麼實際作用。
全形字元的第一個位元組總是被置為163,而第二個位元組則是相同半形字元碼加上128(不包括空格)。
如半形A為65,則全形A則是163(第一個位元組)、193(第二個位元組,128+65)。
知道這個規律 那麼我們也可以遍曆處所有ascii對應的全形字元:
複製代碼 代碼如下:/**
*實際上,全形字元的第一個位元組總是被置為163,
*而第二個位元組則是相同半形字元碼加上128(不包括空格)。
*如半形A為65,則全形A則是163(第一個位元組)、193(第二個位元組,128+65)。
*/
for (byte k = 0x00; k < 0x7f; k++)
{
byte[] ch = new byte[2];
ch[0] = 163;
ch[1] = (byte)(128 + k);
Console.Write(Encoding.GetEncoding("GB2312").GetString(ch));
}
winXp下文字檔預設的儲存編碼是ansi ,注意 這個ansi 他的概念跟GB2312又有不同,除此之外還有unicode 、utf-8
他們之間的關係是:
不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼通訊協定。
這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼。
在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文作業系統下,ANSI 編碼代表 JIS 編碼
C#進行文本讀取時新同學最容易出現不理解為什麼文字檔讀取時是亂碼
複製代碼 代碼如下: StreamReader sr = new StreamReader(Application.StartupPath + @"\config.txt");
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
因為讀取的方式 也就是解碼的方式跟文本儲存時不一樣,所以初始化streamReader時最好指定編碼,Default即ANSI複製代碼 代碼如下: StreamReader sr = new StreamReader(Application.StartupPath + @"\config.txt", System.Text.Encoding.Default);