Unicode转换为UTF-8详解
本文主要是记录Unicode如何转换为UTF-8,不涉及字符编码的历史、制定、版本等,如果想查询这方面的资料,请移步Google。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
- 1.UTF-8编码规则
- 2.Unicode符号范围与UTF-8二进制对应关系
- 3.案例分析
1.UTF-8编码规则
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode二进制码。
因此对于英语字母,UTF-8编码和ASCII码是相同的。
2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。
剩下的没有提及的二进制位,全部为这个符号的Unicode二进制码。
2.Unicode符号范围与UTF-8二进制对应关系
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------------------------
0 <--> 0x7f | 0xxxxxxx
0x80 <--> 0x7FF | 110xxxxx 10xxxxxx
0x800 <--> 0xFFFF | 1110xxxx 10xxxxxx 10xxxxxx
0x10000 <--> 0x10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
3.案例分析
(一)汉字“你”从Unicode转换为UTF-8:
1.将汉字 “你”转换为对应的Unicode编码
你 -->u4f60
2.将对应的Unicode码转换为二进制
u4f60 --> 0100 1111 0110 0000
3.确定Unicode符号范围
0x4f60处于第三级,应此“你”这个汉字有三个字节长度。
4.Unicode转换为UTF-8
从最后一个二进制位开始,将Unicode的二进制依次从后向前填入格式中的x,多出的位补0
1110 (0100) 10(11 1101) 10(10 0000)
所以转换后的汉字“你”的UTF-8格式的二进制为:
1110 0100 1011 1101 1010 0000
此二进制对应的十六进制为:0xE4BDA0
(二)汉字“好”从Unicode转换为UTF-8:
1.将汉字 “好”转换为对应的Unicode编码
好 -->u597d
2.将对应的Unicode码转换为二进制
u597d --> 0101 1001 0111 1101
3.确定Unicode符号范围
0x597d处于第三级,应此"好"这个汉字有三个字节长度
4.Unicode转换为UTF-8
1110 (0101) 10(10 0101) 10(11 1101)
所以转换后的汉字“好”格式的二进制为:
1110 0101 1010 0101 1011 1101
此二进制对应的十六进制为:0xE5A5BD
(三)linux与windows下创建UTF-8文件对比
分别创建一个test.txt文件在linux和window下,输入汉字“你好”保存(此时不敲回车键)。
分别查看这两个文件的十六进制形式:
在linux中:
(vim打开文件,命令模式输入:%!xxd -g 1 查看十六进制;输入:%!xxd -r 恢复文本形式)
e4 bd a0 e5 a5 bd 0a
在windows中:(UltraEdit打开切换为十六进制)
ef bb bf e4 bd a0 e5 a5 bd 0a
可以看见在windows中多了ef bb bf 这utf-8的BOM标记
http://www.cnblogs.com/findumars/p/3620078.html [linux中为什么没有BOM标记?]
https://en.wikipedia.org/wiki/Byte_order_mark [关于BOM标记的更多信息]
如文中有错误的地方欢迎指正,我将不甚感激,谢谢!
欢迎关注我的Github账号:https://github.com/tuzhao
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。