您的位置:首页 > 其它

Unicode转换为UTF-8详解

2016-07-27 16:34 246 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unicode utf-8