【学习笔记】一个关于utf8编码转换的问题
在验证某些东西时,需要使用到中文对应的utf8编码,就到网上搜索了utf8编码转换的一些在线工具,发现了些问题。
百度第一页所有的utf8编码在线转换转换出来的结果都不是utf8编码,都是Unicode编码。直到我翻到第二页才找到一个转换正确的工具。
例如我使用汉字好
转换出来的结果通通都是597D,如下图所示:
转换出来的结果都是Unicode编码。
正确的转换结果如下:
我们常用的汉字Unicode编码范围为4E00-9FA5,对应utf8编码一定是3个字节,所以转换出两个字符肯定是错的。
下面是关于UTF-8编码的简介。
UTF-8简介
UTF-8 由 Unicode Standard [UNICODE]定义。
在 UTF-8 中,在 U+0000…U+10FFFF 范围(UTF-16 可访问范围)的字符使用 1 到 4 个字节序列进行编码。
如果只有一个字节的序列,将高位设置为 0,其余 7 位用于对字符编号进行编码。
在 n 个字节的序列中,n>1,第一个字节的 n 个高位设置为 1,然后有一个位设置为 0。
该字节的剩余位包含字符编号中的位进行编码。后面的字节都将高位设置为 1,后面的位设置为 0,每个字节中留出 6 位来包含要编码的字符中的位。
下表总结了这些不同字节类型的格式。字母 x 表示可用于对字符编号进行编码的位。
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
将字符编码为 UTF-8 的过程如下:
-
从上表的字符数和第一列确定所需的字节数。
重要的是要注意表中的行是互斥的,即只有一种有效的方法来编码给定的字符。 -
根据表的第二列准备字节的高位。
-
从字符编号的位中填入标记为 x 的位,以二进制表示。
首先将字符号的最低位放在序列的最后一个字节的最低位,然后将字符号的下一个高位位放在该字节的下一个高位,以此类推。
当最后一个字节的 x 位被填满时,移动到倒数第二个字节,然后到前一个,依此类推,直到所有 x 位都被填满。
参考资料
https://blog.youkuaiyun.com/u012028275/article/details/122654388