UTF8中文编码范围
简介
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编码是6C49
。6C49
在0800-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编码了。
转自
- UTF8中文编码范围
UTF8中文编码范围相关推荐
- linux内核支持utf8,Linux对非UTF-8中文编码的支持
背景 Linux系统默认采用的UTF-8的编码(Unicode编码的一种),包括系统中的中英文和特殊字符,都是默认采用UTF-8编码. 而在国内,针对中文(包括基本的汉字.各少数民族文字.特殊字符等) ...
- 计算机编码原理——不同数据类型存储中文编码
作者以前在Windows平台编程时,对于字符串显示中文以及不同的字符集编码格式不太理解.最近编写资料用到这部分知识,便通过自己的分析和参考资料做了简单运用,下面我们一起分析常用的编码集与中文编码! 章 ...
- Unicode16 与 UTF-8编码之间的转换
Unicode16 与 UTF-8 中文编码之间的转换 头文件 #include <string> #include <locale> #include <codecvt ...
- php cp936转utf8编码转换乱码问题的解决方案
php cp936转utf8中文编码转换汉字乱码问题的解决方案 今天遇到个问题, 中文字符串 如 åç°ä»£è½»å¥¢å ¨éåç 需要转换为 UTF8,就调用了PHP的函数, mb_conve ...
- php utf8转cp936,php cp936如何转utf8
php cp936转utf8的设置方法:首先创建一个php示例文件:然后定义一个toUtf8方法:接着通过[iconv('utf-8', 'latin1//IGNORE', $str);]方法解决转换 ...
- php iconv #039;cp936#039; 转gbk,php cp936转utf8编码转换乱码问题的解决方案
php cp936转utf8中文编码转换汉字乱码问题的解决方案 今天遇到个问题, 中文字符串 如 åç°ä»£è½»å¥¢å ¨éåç 需要转换为 UTF8,就调用了PHP的函数, mb_conve ...
- Visual Studio 中文显示乱码问题
今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...
- c++十六进制加法_C++中输出十六进制形式的字符串
前言 在进行 i18n 相关的开发时,经常遇到字符编码转换的错误.这时如果能把相关字符串用十六进制的形式打印出来,例如,"abc" 输出成 "\\x61\\x62\\x6 ...
- php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...
HTML5 video标签(播放器)学习笔记(一):使用入门 近有在学习html5中video标签(播放器)的使用,这里做一些学习笔记,方便自己查阅和记录,本文是第一篇,将介绍的是使用该标签初始化该做 ...
最新文章
- linux下基于lvs-dr模式的电子商务平台搭建
- static in c language
- Vue.js学习过程
- 命令行快速部署Exchange2010
- 实用!Mybatis中trim标签的使用教程
- 判断是否为回文字符串
- 手机12306买卧铺下铺技巧_12306订下铺有什么技巧?
- Lab07 南向协议AC-DCN esight
- python3操作win32com报错:AttributeError: Open.SaveAs 或者<COMObject Open>“, line 8, in SaveAs pywintypes.c
- mysql sql语句 查询文章表,评论表(根据评论表文章评论次数排序查询出文章count(),group,left join)
- 微信公众号下发红包 -- PHP
- 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
- keras进行时间序列预测
- 【手把手反内卷】开创全新AI多模态任务一视听分割:代码实践、优化教程(二)
- MYSQL各种乱码问题
- URP——后期处理特效——膜颗粒Film Grain
- 微信提示:非微信官方网页,需点继续访问才能打开网页的解决方案
- 如何去除discuz的powered by discuz!代码
- 【海康威视实习总结收获】
- 切绳子题解(博客搬家)