下述内容大部分引用自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都是些什么?的更多相关文章

  1. 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是计算机领域的一项 ...

  2. PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢?

    PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢? i 不区分大小写 s 模式中的圆点元字符(.)匹配所有的字符,包括换行符 x 模式中的空白字符除了被转义的或在字符类中的以外 ...

  3. cookie、session和application都是些什么神?——图文加案例,不怕你不会,就怕你不看

    cookie.session和application都是些什么神? 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好 ...

  4. 所有做java开发的都是些垃圾

    所有做java开发的都是些垃圾,再垃圾的框架,只要有人用,对java程序员来说那就是高性能,高可用,解耦的,非常优秀的一款框架.属于吃屎都吃的津津有味.java里的框架都是垃圾,连一个不错的都没有.比 ...

  5. SEO大神都是些什么人

    http://www.wocaoseo.com/thread-97-1-1.html 貌似好久没有更新seo培训联盟的文章了,最近一直在专心学习其他的东西,前一段写了几篇关于用户需求和体验的文章,但是 ...

  6. BIOS、UEFI、Boot Loader都是些什么

    BIOS.UEFI.Boot Loader都是些什么 目录 BIOS.UEFI.Boot Loader都是些什么 什么是BIOS 基本的输入输出是什么 自检程序"检"了什么 系统自 ...

  7. Java后端程序员都做些什么?

    这个问题来自于QQ网友,一句两句说不清楚,索性写个文章. 我刚开始做Web开发的时候,根本没有前端,后端之说. 原因很简单,那个时候服务器端的代码就是一切:接受浏览器的请求,实现业务逻辑,访问数据库, ...

  8. 在中国使用苹果Mac电脑的都是些什么人?

    来源:PConline 资讯 文章收录于:风云社区(提供上千款各类Mac软件下载)   (图片来源于互联网分享,如涉及版权问题请联系作者删除) 在中国用Mac的都是什么人?腾讯CDC用户研究中心对 Q ...

  9. go语言爬虫 - TapTap用户都喜欢些什么游戏

    前面的废话 说到爬虫,首先想到的当然是python~ 它在机器学习.爬虫数据分析领域可谓是如日中天,十分热门.但我最近在学习go语言,所以就用go写了 TapTap社区 这是一个高品质的游戏分享社区, ...

随机推荐

  1. 校内训练0609 problem c

    [题目大意] 给一棵树,求有多少条路径满足总和-最大值 是P的倍数 n<=10^5, P<=10^7 [题解] 一看就是点分治嘛 不考虑子树合并,考虑poj1741的做法,每次考虑经过重心 ...

  2. HDU 2089 不要62 (数学)

    题目链接 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了 ...

  3. bzoj 2151 贪心

    几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...

  4. Web Application Vulnerabilities and Potential Problem Due to Bad Design

    web应用设计中不安全的设计及潜在的风险: REF: https://msdn.microsoft.com/en-us/library/ff648647.aspx

  5. python—用for循环、while循环和一句话打印九九乘法表

    用for循环打印九九乘法表: for i in range (1,10): for j in range(1,10): print(j,"x",i,"=",i* ...

  6. 一次 select for update 的悲观锁使用引发的生产事故

    1.事故描述 本月 8 日上午十点多,我们的基础应用发生生产事故.具体表象为系统出现假死无响应.查看事发时间段的基础应用 error 日志,没发现明显异常.查看基础应用业务日志,银行结果处理的部分普遍 ...

  7. pandas基础学习

    1.导入两个数据分析重要的模块import numpy as npimport pandas as pd2.创建一个时间索引,所谓的索引(index)就是每一行数据的id,可以标识每一行的唯一值dat ...

  8. hdu 5190(水题)

    Go to movies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  9. OpenAcc社区版安装教程(Linux版)(更新版)

    官方安装过程如下图所示 1.安装前 下载OpenAcc社区版 1,目前为止的最新版,平台是Linux,选择Linux x86-64. 我的服务器系统是CentOs 下载地址链接:https://www ...

  10. 安卓长按交互onCreateContextMenu的简单 用法

    1.可在activity和fragment中使用. 2.使用方法 (1)注册 registerForContextMenu(btn);//btn是要实现交互的控件 (2)重写onCreateConte ...