UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?
下述内容大部分引用自CSDN:
Unicode 是 unicode.org 制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持。unicode.org 官方对 Unicode 的定义是:Unicode provides a unique number for every character, no matter what the platform, no matter what the program, no matter what the language。可见,Unicode 所做的是为每个字符定义了一个相应的数字表示。比如,“a”的 Unicode 值是 0x0061,“一”的 Unicode 值是 0x4E00,这是最简单的情况,每个字符用2个字节表示。
unicode.org 定义了百万个以上的字符,如果将所有的字符用统一的格式表示,需要的是 4 个字节。“a”的 Unicode 表示就会变成 0x00000061,而“一“的 Unicode 值是 0x00004E00。实际上,这就是 UTF32,Linux 操作系统上所使用的 Unicode 方案。
但是,仔细分析可以发现,其实绝大部分字符只使用 2 个字节就可以表示了。英文的 Unicode 范围是 0x0000-0x007F,中文的 Unicode 范围是 0x4E00-0x9F**,真正需要扩展到 4 个字节来表示的字符少之又少,所以有些系统直接使用 2 个字节来表示 Unicode。比如 Windows 系统上,Unicode 就是两个字节的。对于那些需要 4 个字节才能表示的字符,使用一种代理的手法来扩展(其实就是在低两个字节上做一个标记,表示这是一个代理,需要连接上随后的两个字节,才能组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种 Unicode 表示方法就是 UTF16。一般在 Windows 平台上,提到 Unicode,那就是指 UTF16 了。
至于 UTF16-LE 和 UTF16-BE,则与计算机的 CPU 构架有关。LE 指 Little Endian,而 BE 指 Big Endian。由于 UTF16 是双字节编码,所以两个字节保存时哪个在前,哪个在后关系到解析出字符的结果。至于为什么会出现 BE 和 LE 的编码,则是由于历史原因造成的:在 Mac 和 PC 机上,对字节顺序的理解是不一致的。如果一个文件不明确说明 UTF16 使用的是 BE 还是 LE,那么就需要通过 BOM 来指明了。我们一般的 X86 系统都是 Little Endian 的,可以认为 UTF16=UTF16-LE。
由于对于欧洲和北美,实际上使用的编码范围在 0x0000-0x00FF 之间,只需要一个字符就可以表示所有的字符。即使是使用 UTF16 来作为内存的存取方式,还是会带来巨大的空间浪费,因此就有了 UTF8 的编码方式。UTF8 是一个可变长度字符编码,它同时是一个前缀码,前缀码的特征是,编码系统中的任意一个合法的码不会是另外一个码的前缀,所以 UTF8 不需要指定字节序。一个 UTF8 编码可以用 1~6 个字节来表示,将第一个字节的前几个比特设置为 1 来指定这个字符占用几个比特,比如一个两字节的字符的编码,第一位是 110xxxxx,第二位是 10xxxxxx,而一个六字节字符的编码是这样的:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx,所以 UTF-8 最多能编码 231 个字符。所以对于只需要1个字节的字符,就使用一个字节。对于中日韩等原本需要两个字节才能表示的字符,则通过一个UTF16-UTF8 的算法实现相互之间的转换,一般需要 3 个字节才能表示。UTF8 使用的算法很有意思,大致映射关系如下:
Unicode编码 | UTF-8编码(二进制) |
U+0000 – U+007F | 0xxxxxxx |
U+0080 – U+07FF | 110xxxxx 10xxxxxx |
U+0800 – U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
U+10000 – U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
由于 UTF8 可以方便的转换为 UTF16 和 UTF32,而且 UTF8 在每个操作系统平台上的实现都是一样的,也不存在跨平台的问题,所以 UTF8 成为跨平台的 Unicode 很好的解决方案。当然,对于中文来说,由于每个字符需要 3 个字节才能表示,还是有点浪费的。
UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?的更多相关文章
- C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换
zt https://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/ Unicode Unicode是计算机领域的一项 ...
- PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢?
PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢? i 不区分大小写 s 模式中的圆点元字符(.)匹配所有的字符,包括换行符 x 模式中的空白字符除了被转义的或在字符类中的以外 ...
- cookie、session和application都是些什么神?——图文加案例,不怕你不会,就怕你不看
cookie.session和application都是些什么神? 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好 ...
- 所有做java开发的都是些垃圾
所有做java开发的都是些垃圾,再垃圾的框架,只要有人用,对java程序员来说那就是高性能,高可用,解耦的,非常优秀的一款框架.属于吃屎都吃的津津有味.java里的框架都是垃圾,连一个不错的都没有.比 ...
- SEO大神都是些什么人
http://www.wocaoseo.com/thread-97-1-1.html 貌似好久没有更新seo培训联盟的文章了,最近一直在专心学习其他的东西,前一段写了几篇关于用户需求和体验的文章,但是 ...
- BIOS、UEFI、Boot Loader都是些什么
BIOS.UEFI.Boot Loader都是些什么 目录 BIOS.UEFI.Boot Loader都是些什么 什么是BIOS 基本的输入输出是什么 自检程序"检"了什么 系统自 ...
- Java后端程序员都做些什么?
这个问题来自于QQ网友,一句两句说不清楚,索性写个文章. 我刚开始做Web开发的时候,根本没有前端,后端之说. 原因很简单,那个时候服务器端的代码就是一切:接受浏览器的请求,实现业务逻辑,访问数据库, ...
- 在中国使用苹果Mac电脑的都是些什么人?
来源:PConline 资讯 文章收录于:风云社区(提供上千款各类Mac软件下载) (图片来源于互联网分享,如涉及版权问题请联系作者删除) 在中国用Mac的都是什么人?腾讯CDC用户研究中心对 Q ...
- go语言爬虫 - TapTap用户都喜欢些什么游戏
前面的废话 说到爬虫,首先想到的当然是python~ 它在机器学习.爬虫数据分析领域可谓是如日中天,十分热门.但我最近在学习go语言,所以就用go写了 TapTap社区 这是一个高品质的游戏分享社区, ...
随机推荐
- Spring学习--使用 utility scheme 定义集合及 p命名空间
util schema 定义集合: 使用基本的集合标签定义集合时 , 不能将集合作为独立的 Bean 定义 , 导致其他 Bean 无法引用该集合 , 所以无法在不同 Bean 之间共享集合. 可以用 ...
- 转:Spring-session & redis 子域名共享session
Spring-session & redis 子域名共享session 例子: a.example.com b.example.com spring 版本 4.2.6.RELEASE Spri ...
- js删除一个父元素下面的所有子元素
比如<div id="ok"><button tpye='button'>111111</button><p>22222</p ...
- jsp小知识点(2)
一:自定义的函数库:在wh.tld中 <description>JSTL 1.1 functions library</description> <display-nam ...
- 【BZOJ3942】Censoring [KMP]
Censoring Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一个S串和一个T串,长 ...
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
一.利用Modal形式展示控制器 1.如何展示// vc就是要展示的新控制器[self presentViewController:vc animated:YES completion:^{ N ...
- linux基础的基础命令操作
一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 操作:su - root 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 操作:ctrl ...
- 3.orm之peewee
peewee是一款orm框架,为什么选择peewee,是因为它比较简单和Django比较类似,而且还有一个async-peewee,可以进行异步化. 如何定义model和生成表 ''' 我们要定义两张 ...
- sudo cd为什么不能够执行
问题描述 我想要cd到/etc/docker,但是它给我一个权限不够的错误,然后,我想到使用sudo cd /etc/docker时,它告诉我sudo: cd:找不到命令. 于是,郁闷的我就去上网找了 ...
- docker从零开始 存储(四)tmpfs挂载
使用tmpfs挂载 volume和bind mounts允许您在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs moun ...