文章目录
- 前言
- 一、UTF-8、GBK、GB2312、Unicode
- 二、转换原理
- 1.背景
- 2.UTF-8编码规则
- 总结
前言
遇到UTF-8和GBK互转问题,稍微记录一下重点~
一、UTF-8、GBK、GB2312、Unicode
GBK:《汉字内码扩展规范》。简体繁体均支持。
GB2312:《信息交换用的汉字字符集编码》。简体,GBK的未拓展版本。
Unicode:Union code,统一码,是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。大而全。
UTF-8:针对Unicode设计的可变长编码,互联网常用编码方式。
二、转换原理
1.背景
GBK、GB2312等与UTF8之间必须通过Unicode编码才能相互转换,所以我们可以看到,在网上找到的非库函数的代码,均需依赖一个Unicode的字库作为转换的支撑。
2.UTF-8编码规则
基于这个背景,我们再了解一下UTF-8的编码规则:
-
对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于英语字母, UTF-8编码和ASCII码是相同的.
-
对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.
Unicode符号范围(十六进制) | UTF-8编码方式(二进制) |
---|---|
0000 0000 - 0000 007F | 0xxxxxxx |
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
因此,从Unicode转换为UTF-8的主要原理就是:1.判断是否为ASCII码,如果是ASCII码则无需转换;2.如果不是ASCII码,判断当前字符Unicode符号的值处于哪个范围区间,并根据这个区间进行相应的移位和 | 运算操作,最后算出相应的UTF-8的值.
UTF-8转换为Unicode也是类似道理,就不细说了.
总结
简单总结了一下,实际实现过程中可能会遇到大小端的问题。
附一个网址查编码转换:http://www.mytju.com/classcode/tools/encode_utf8.asp