介绍
UTF-8是Unicode的一种实现方式,比如一个汉字用Unicode编码表示是两个字节,而用UTF8编码表示则为3个字节。
之所以写这篇文章,是因为我的webserver程序中,浏览器发送资源请求且该资源名为中文时出现了编码问题。
UTF8编码
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。 如下表
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
当我们将Unicode编码转换为UTF-8编码时就是将,Unicode编码填入合适字节的x中(如上表)。
直接看例子:
比如:"苦"的Unicode编码是 82E6
,总共是16个bit,所以选取3字节(其中的x有16个能放),我们直接将82E6
二进制位插入到x中去。即
最终得到的UTF-8编码为e8 8b a6
C语言代码验证
#include <stdio.h>
#include <string.h>
int main(void) {
char *str = "苦瓜";
for(int i = 0;i < strlen(str); ++i) {
printf("%02x ",str[i]); // 输出utf8编码
}
return 0;
}
测试结果
瓜的utf8编码就留给大家计算练习了。