汉字GB编码,Unicode编码,区位码, 大小端
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汉字GB编码,Unicode编码,区位码,大小端
汉字GB编码,是对ascii码的一个扩展, 用来表示和存储汉字。最初设计的7位ascii码以
及扩展后的8位ansi编码,只能表示控制字符,英文字母,数字和一些常用符号。于是
GB码首先被提出并用于汉字的编码表示。GB码完全兼容ascii码,但丢弃掉了ansi比ascii 所多出来的全部符号。 GB码同样采用单字节方式存储和处理,比如'A'的ascii码为0x41,
汉字'王'的GB码为0xCDF5, 那么字符串“A王”保存在一个char[4]当中的话,内容应该是[0]=0x41, [1]=0xcd, [2]=0xf5, [3]=0x00,在处理这样的字符串时,需要首先判断字节最高位,因为ascii码只占用了字节的低7位,因此最高位永远是0,所以若判断最高位为0,则按ascii码处理,若为1,则按GB码处理,需要读入连续的两个字节,则可以得到一
个GB字符,如cdf5拼起来,则得到’王’的GB码。
Unicode码,是另一套编码规则,使用2个字节来表示一个字符,可以表示2^16 = 65536
个不同的字符。 Unicode同样对ascii兼容,对每个ascii码不足16位(两个字节)的部分
补0即是相同字符的Unicode码,此外,Unicode码还定义了中文等全球N多种文字及符号, 比如王的Unicode码即为0x738b.
下面的例子说明了汉字GB和Unicode码的区别:
char cn_char_u[]={L'王'};//8b //low byte of 738b is passed to cn_char_u, x86 acts as little-endian, low byte maps low address
char cn_char[]={'王'};//f5 //low byte of cdf5 is passed to cn_char
//char cn_str_u[]={L"王"};//738b //illegal statement of assignment, not accept by compiler
char cn_str[]={"王"};//cdf5 //cn_str[0] = cd, cn_str[1] = f5, cn_str[2]= \0
WCHAR cn_str_w_u[]={L"王"}; //738b
//WCHAR cn_str_w[]={"王"}; //f5cd //illegal statement of assignment
WCHAR cn_char_w_u[] = {L'王'}; //738b
WCHAR cn_char_w[] = {'王'}; //cdf5
其中L’王’, L表示对后面的字符按照 Unicode编码处理, L被大多数编译器所支持。
第一句代码中,L’王’即为0x738b, 赋值给一个char的时候,即把低8位8b赋于char,因
为x86系列是little-endian模式。
同理,第二句则把f5赋于char变量
第三句char cn_str[]={"王"} ‘王’在这里按照GB码(Visual C默认使用GB)是0xcdf5, 所以
cn_str则为char[2+1], char[0]=0xcd, char[1]=0xf5, char[2]=0x00.
第四句WCHAR cn_str_w_u[]={L"王"}; wchar == short int, 为16位类型,因此赋值为0x738b. 第五句和第六句显而易见,不解释。
顺便提一下大小端big-endian & little-endian
计算机中不论几字节的数据类型,存储的时候最终还是要按字节进行存储。
以0x1234为例,这是一个2字节数据,存储的时候,大端情况下,0x12首先存在低地址,地址加一,再保存0x34, 即数据的大端存在低地址上。小端情况下,0x34存在低地址,地
址加一,然后再保存0x12, 即数据小端存在低地址。
汉字区位码
汉字区位码,是编制GB码的第一步。GB码除了汉字,还有继承自ascii的部分,还有符
号等其它部分,但其中的汉字部分,则是对汉字区位码按照一定规则转换所得。
规则如下:
汉字’王’的区位码是4585,区号45,位号85. 首先对区号和位号加上32,因为0-31编
码保留作它用。现在得到77和117,写作二进制为01001101和01110101,然后,为了
与ascii码区分,将这两个字节的最高位置1,得到11001101和11110101,即为0xcd和
0xf5, 因此0xcdf5即为’王’的GB码。