关于字符编码

1. ASCII

  ASCII 只有127个字符,表示英文字母的大小写、数字和一些符号,但由于其他语言用ASCII 编码表示字节不够,例如:常用中文需要两个字节,且不能和ASCII冲突,中国定制了GB2312编码格式,相同的,其他国家的语言也有属于自己的编码格式

2. Unicode

   由于每个国家的语言都有属于自己的编码格式,在多语言编辑文本中会出现乱码,这样Unicode应运而生,Unicode就是将这些语言统一到一套编码格式中,通常两个字节表示一个字符,而ASCII是一个字节表示一个字符,这样如果你编译的文本是全英文的,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

3. UTF-8

 为了解决上述问题,又出现了把Unicode编码转化为“可变长编码”UTF-8编码,UTF-8编码将Unicode字符按数字大小编码为1-6个字节,英文字母被编码成一个字节,常用汉字被编码成三个字节,如果你编译的文本是纯英文的,那么用UTF-8就会非常节省空间,并且ASCII码也是UTF-8的一部分。

4.GB2312

ANSI编码中的一种,对ASNI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉子字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。GB2312编码用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个汉字

5.GBK

汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。GBK兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位

 

byte* 里边内容可以是ASCII 也可以是UTF-8或者Unicode,byte*或者string只是一个字节流数组,想让他显示为真正的字,需要进行解码:

譬如汉字“哈” utf-8编码就是 /xe5/x93/x88; char arr[3]={e5,93,88};

如何显示汉字(以宽字符形式)呢:iOS例子

//char--wchar;(char *Ch, wchar_t *WCh)

int Len  = (int)strlen(Ch);
//注意一般不要这样用,因为strlen遇到0x00 就结束了
//0x00对应的就是'\0',这和数字字符0(字符0 = '0')是不一样的;
//strlen他会把第一个0x00后面的数截掉
NSString *sutf = [[NSString alloc] initWithBytes:Ch length:Len encoding:NSUTF8StringEncoding];
    
    WCh = (wchar_t*)[sutf cStringUsingEncoding:NSUTF32StringEncoding];//L"XX";

 GBK 转宽字符显示:

100ABCEDFS分字段对应的GBK编码是下表,在byte字符数组中的存储(内存中的样子): 0x123432edf(内存):31 30 30 41 42 46 53 b7 d6 00.....

 

 

 

//GBK编码字节流存储。转汉字
//100ABCEDFS分
char * str = 0x31 0x30.....(见表格)
//gb18030---nsstring---wchar;
NSStringEncoding enc =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

  NSString* str = [[NSString alloc]initWithBytes:Str length:strlen(Str) encoding:enc ];

const char * a =[str UTF8String];//nsstring转char*
//再用上边的char to wchar
int Len  = (int)strlen(Ch);//注意这里这样写不严谨会出现截断

NSString *sutf = [[NSString alloc] initWithBytes:Ch length:Len encoding:NSUTF8StringEncoding];
    
    WCh = (wchar_t*)[sutf cStringUsingEncoding:NSUTF32StringEncoding];//L"XX";

我们来看一下ascii码表:(下图只是部分,不全)

 

 

禁止转载

posted on 2021-07-01 15:04  邗影  阅读(254)  评论(0编辑  收藏  举报

导航