admin 管理员组文章数量: 887016
2024年2月25日发(作者:接口箱的splitter是什么意思)
Gbk码位图
Gb18030码位图
Unicode编码
U+0000 – U+007F
U+0080 – U+07FF
U+0800 – U+FFFF
U+10000 – U+10FFFF
UTF-8编码(二进制)
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode编码
U+0000 – U+FFFF
0x1234
U+0x10000 -U+10FFFF
UTF-16编码(二进制)
对应的16位unsigned int
0x1234
110110yyyyyyyyyy 110111xxxxxxxxxx
各种编码之间转换的基本原理:以unicode码值为中间载体,被转换的字符先根据其原来的编码规则,解码出对应的unicode值,然后,根据unicode值在转换成目标编码。由此,就需要不同编码码值和unicode的对应关系,目前gbk和unicode之间的对应关系由查表得到,gb18030和unicode的对应关系一部分查表,一部分通过计算可得。
1. gbk to utf8
gbk两个字节表示一个字符,根据gbk与unicode对应关系,得到该字符的unicode值,得到unicode值之后,根据utf8的编码规则,判断unicode值范围,确定用来编码的字节数,确定字节数后,由utf8的编码规则分别填充每个字节;
例子:
‘破’的gbk编码为0xc6c6,两个字节分别为0xc6和0xc6,根据gbk与unicode对应关系查表得到‘破’的unicode值为0x7834;根据utf8编码规则,0x7834位于
U+0800 – U+FFFF区间,所以需要三个字节,且编码后形式为1110xxxx 10xxxxxx 10xxxxxx,0x7834对应的二进制位0111 1000 0011 0100,将此二进制从左到右填充x,就得到后‘破’的utf8编码11100111 10100000 10110100,也就是0xE7 0xA0 0xB4三个字节。
2. utf8 to gbk
utf8变长字节编码,根据utf8的编码规则,根据收到的第一个字节大小判断构成该字符的字节数num,分别判断从当前字节起的num个字节是否符合utf8编码规则,不符合做出错处理;符合utf8的规则后,开始解码为unicode值,解码的操作就按照编码返回来,得到unicode码值后,查表就可以得到对应的gbk编码字节。
例子:
‘破’的utf8编码值为0xE7 0xA0 0xB4三个字节,对应的二进制为11100111 10100000
10110100,按照utf8的编码规则,着色部分组合到一起为对应的unicode值,于是得到unicode值0100,0x7834,查表得到0x7834对应的gbk码值0xc6c6,这样转换后的gbk编码就是0xc6,0xc6两个字节。
3.gb18030 to utf8
gb18030变长编码,1、2、4个字节;对收到的gb18030编码数据先根据第一个字节确定几个字节构成的字符,如果<0x7f,则为一个字节;否则为2或4个字节,接下来判断第二个字节的范围,若第二个字节在40 7E或者80 FE之间,则为二个字节;否则为四个字节。确定字节后,开始寻找对应的unicode值,18030与gbk不同的是,不同字节数确定unicode的方法不同,2字节的与gbk一样(个别不一致),4字节的一部分需要查表(0x81308130~0x8439FE39),4字节的其余可根据公式算出(0x90308130~0xE339FE39)。假设某字符的gb18030编码为四个字节0x91 0x31 0x84
0x36,根据范围,此四个字节需要通过公式计算, 计算公式为(0x91-0x90)*12600+(0x31-0x30)*1260 +(0x84-0x81)*10+(0x36-0x30)= 0x3648,即unicode值。得到unicode值后,按照utf8编码可得到对应的utf8字节。
4. utf8 to gb18030
utf8转换unicode值在2里面以介绍,得到unicode之后,判断unicode值落在的区间,如果unicode值在0x0000-0xFFFF之间,则通过查表可得到对应的gb18030码值;若大于0xFFFF,则u = unicode-0x10000,根据以下公式得到对应的gb18030码值。
U=Unicode编码-0x10000
m1=U/12600
n1=U%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
第一字节b1=m1+0x90,第二字节b2=m2+0x30,第三字节b3=m3+0x81
第四字节b4=n3+0x30
版权声明:本文标题:字符编码转换 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1708806351h531621.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论