简介

UTF-8有点类似于Haffman编码,它将Unicode编码为:
00000000-0000007F的字符,用单个字节来表示;
00000080-000007FF的字符用两个字节表示 (中文的编码范围);
00000800-0000FFFF的字符用"三个字节**表示;

编码转换:iconv -f “文件目前编码” -t “文件转换后的编码” -o “转换后生成的新文件名” “源文件名”temp = Iconv.conv(“UTF-8”,“gb2312”,a)

因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符。 在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节 和GB编码的两个字节是不同的)。

big endian和little endian

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开, 由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面, 还是将49写在前面?如果将6C写在前面,就是big endian。而如果将49写在前面,就是little endian。

UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制) UTF-8 字节流(二进制)

0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C496C490800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。 将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89

读者可以用记事本测试一下我们的编码是否正确。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码, 定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。 但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。 例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:
在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。 而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。 因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者 可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

转自

  1. UTF8中文编码范围

UTF8中文编码范围相关推荐

  1. linux内核支持utf8,Linux对非UTF-8中文编码的支持

    背景 Linux系统默认采用的UTF-8的编码(Unicode编码的一种),包括系统中的中英文和特殊字符,都是默认采用UTF-8编码. 而在国内,针对中文(包括基本的汉字.各少数民族文字.特殊字符等) ...

  2. 计算机编码原理——不同数据类型存储中文编码

    作者以前在Windows平台编程时,对于字符串显示中文以及不同的字符集编码格式不太理解.最近编写资料用到这部分知识,便通过自己的分析和参考资料做了简单运用,下面我们一起分析常用的编码集与中文编码! 章 ...

  3. Unicode16 与 UTF-8编码之间的转换

    Unicode16 与 UTF-8 中文编码之间的转换 头文件 #include <string> #include <locale> #include <codecvt ...

  4. php cp936转utf8编码转换乱码问题的解决方案

    php cp936转utf8中文编码转换汉字乱码问题的解决方案 今天遇到个问题, 中文字符串 如  åç°ä»£è½»å¥¢å ¨éåç 需要转换为 UTF8,就调用了PHP的函数, mb_conve ...

  5. php utf8转cp936,php cp936如何转utf8

    php cp936转utf8的设置方法:首先创建一个php示例文件:然后定义一个toUtf8方法:接着通过[iconv('utf-8', 'latin1//IGNORE', $str);]方法解决转换 ...

  6. php iconv #039;cp936#039; 转gbk,php cp936转utf8编码转换乱码问题的解决方案

    php cp936转utf8中文编码转换汉字乱码问题的解决方案 今天遇到个问题, 中文字符串 如  åç°ä»£è½»å¥¢å ¨éåç 需要转换为 UTF8,就调用了PHP的函数, mb_conve ...

  7. Visual Studio 中文显示乱码问题

    今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...

  8. c++十六进制加法_C++中输出十六进制形式的字符串

    前言 在进行 i18n 相关的开发时,经常遇到字符编码转换的错误.这时如果能把相关字符串用十六进制的形式打印出来,例如,"abc" 输出成 "\\x61\\x62\\x6 ...

  9. php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...

    HTML5 video标签(播放器)学习笔记(一):使用入门 近有在学习html5中video标签(播放器)的使用,这里做一些学习笔记,方便自己查阅和记录,本文是第一篇,将介绍的是使用该标签初始化该做 ...

最新文章

  1. linux下基于lvs-dr模式的电子商务平台搭建
  2. static in c language
  3. Vue.js学习过程
  4. 命令行快速部署Exchange2010
  5. 实用!Mybatis中trim标签的使用教程
  6. 判断是否为回文字符串
  7. 手机12306买卧铺下铺技巧_12306订下铺有什么技巧?
  8. Lab07 南向协议AC-DCN esight
  9. python3操作win32com报错:AttributeError: Open.SaveAs 或者<COMObject Open>“, line 8, in SaveAs pywintypes.c
  10. mysql sql语句 查询文章表,评论表(根据评论表文章评论次数排序查询出文章count(),group,left join)
  11. 微信公众号下发红包 -- PHP
  12. 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
  13. keras进行时间序列预测
  14. 【手把手反内卷】开创全新AI多模态任务一视听分割:代码实践、优化教程(二)
  15. MYSQL各种乱码问题
  16. URP——后期处理特效——膜颗粒Film Grain
  17. 微信提示:非微信官方网页,需点继续访问才能打开网页的解决方案
  18. 如何去除discuz的powered by discuz!代码
  19. 【海康威视实习总结收获】
  20. 切绳子题解(博客搬家)

热门文章

  1. 任志强称地产投资增速将反弹 不借救市哄抬房价
  2. Java中if语句详解
  3. 自动化立体仓库的规划与设计(学习笔记)
  4. 好的设计要多分享,5款优秀在线原型设计案例
  5. 【华为OD统一考试B卷 | 100分】5键键盘(C++ Java JavaScript Python)
  6. 今天特意分享一个程序猿的微信群,聊天专用
  7. 【CodeForces】CF13C Sequence(配数学证明)
  8. jsp网页无法加载css解决方法
  9. 关于刘慈欣的若干个标题
  10. 吊炸天!程序员定制版高效摸鱼神器...