牛骨文教育服务平台(让学习变的简单)
博文笔记

Unicode转换为UTF-8详解

创建时间:2016-07-27 投稿人: 浏览次数:2363

本文主要是记录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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。