C#中字符串编码处理
GB2312是简体中文系统的标准编码用“区”跟“位”的概念表示称之为区位码
区指代大的范围位相当于偏移量。
每个汉字占两个字节
高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE。
它的规律好像是按拼音a到z的顺序排列的
“啊”字是GB2312之中的第一个汉字,它的区位码就是1601
为此我们现在用代码的方式输出一个汉字
c#下是little字节序b0跑后面去了。
ushortu=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
//bytehi=0xB0;
//bytelo=0xA1;
for(bytei=0xB0;i<=0xF7;i++)
{
for(bytej=0xA1;j<=0xFE;j++)
{
//bytet=(byte)(j|(byte)0x01);
Console.Write(Encoding.GetEncoding("GB2312").GetString(newbyte[]{i,j}));
}
}
ASCII是美国信息交换标准码他是从0~127,一个字节8位最高是255就是说一个字节都用不完。
GB2312里也有字母称之为全角字符 ,gb2312里也包括ascii码称之为半角字符。
全角字符看上去怪怪的感觉有点不一样就像这样全角:A半角:A 全角:a半角:a
全角字符除了在文字系统里用到没什么实际作用。
全角字符的第一个字节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。
如半角A为65,则全角A则是163(第一个字节)、193(第二个字节,128+65)。
知道这个规律那么我们也可以遍历处所有ascii对应的全角字符:
winXp下文本文件默认的保存编码是ansi,注意这个ansi他的概念跟GB2312又有不同,除此之外还有unicode、utf-8
/**
*实际上,全角字符的第一个字节总是被置为163,
*而第二个字节则是相同半角字符码加上128(不包括空格)。
*如半角A为65,则全角A则是163(第一个字节)、193(第二个字节,128+65)。
*/
for(bytek=0x00;k<0x7f;k++)
{
byte[]ch=newbyte[2];
ch[0]=163;
ch[1]=(byte)(128+k);
Console.Write(Encoding.GetEncoding("GB2312").GetString(ch));
}
他们之间的关系是:
不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。
这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。
在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码
C#进行文本读取时新同学最容易出现不理解为什么文本文件读取时是乱码
StreamReadersr=newStreamReader(Application.StartupPath+@"\config.txt");
stringline;
while((line=sr.ReadLine())!=null)
{
Console.WriteLine(line);
}
因为读取的方式也就是解码的方式跟文本存储时不一样,所以初始化streamReader时最好指定编码,Default即ANSI
StreamReadersr=newStreamReader(Application.StartupPath+@"\config.txt",System.Text.Encoding.Default);
相关文章