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


本文标签: 编码 字节 对应 得到 规则