字符的编码格式有哪些?utf-8 和 utf-16 有什么区别?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/89210063

大家好,这里是修真院前端小课堂,今天给大家分享的是

《字符的编码格式有哪些?utf-8 和 utf-16 有什么区别?》

1. 背景介绍

字符的编码格式

计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如 'a' 用什么表示,称为 "编码";反之,将存储在计算机中的二进制数解析显示出来,称为 "解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致 'a' 解析成 'b' 或者乱码。

字符集:

是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码:

是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

 

2. 知识剖析

常用的字符编码格式:

常见字符集名称:ASCII 字符集、GB2312 字符集、BIG5 字符集、GB18030 字符集、Unicode 字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本 EASCII 则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被 Unicode 追上的迹象),并等同于国际标准 ISO/IEC 646。

ASCII 编码:将 ASCII 字符集转换为计算机可以接受的数字系统的数的规则。使用 7 位(bits)表示一个字符,共 128 字符;但是 7 位编码的字符集只能支持 128 个字符,为了表示更多的欧洲常用字符对 ASCII 进行了扩展,ASCII 扩展字符集使用 8 位(bits)表示一个字符,共 256 字符。ASCII 字符集映射到数字编码规则如下图所示

SCII 的最大缺点是只能显示 26 个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如 naïve、café、élite 等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。而 EASCII 虽然解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。因此现在的苹果电脑已经抛弃 ASCII 而转用 Unicode。

需要注意的是:

0-9:48-57

a~z:97~122

A~Z:65~90

Unicode 源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。



统一码、万国码、单一码、标准万国码) 是基于通用字符集(Universal Character Set)的标准来发展,每个新版本插入更多新的字符。直至目前为止的第六版,Unicode 就已经包含了超过十万个字符(在 2005 年,Unicode 的第十万个字符被采纳且认可成为标准之一)、一组可用以作为视觉参考的代码图表、一套编码方法与一组标准字符编码、一套包含了上标字、下标字等字符特性的枚举等。Unicode 组织(The Unicode Consortium)是由一个非营利性的机构所运作,并主导 Unicode 的后续发展,其目标在于:将既有的字符编码方案以 Unicode 编码方案来加以取代,特别是既有的方案在多语环境下,皆仅有有限的空间以及不兼容的问题。

3. 常见问题

什么是 utf-8 和 utf-16?

4. 解决方案

我们可以这样理解,unicod 是一种字符集,而 utf-8,utf-16 是两种编码方案。

utf-32:

使用 4 字节的数字来表达每个字母、符号,或者表意文字 (ideograph),每个数字代表唯一的至少在某种语言中使用的符号的编码方案,称为 UTF-32。UTF-32 又称 UCS-4 是一种将 Unicode 字符编码的协定,对每个字符都使用 4 字节。就空间而言,是非常没有效率的。这种方法有其优点,最重要的一点就是可以在常数时间内定位字符串里的第 N 个字符,因为第 N 个字符从第 4×Nth 个字节开始。虽然每一个码位使用固定长定的字节看似方便,它并不如其它 Unicode 编码使用得广泛。

utf-16:

尽管有 Unicode 字符非常多,但是实际上大多数人不会用到超过前 65535 个以外的字符。因此,就有了另外一种 Unicode 编码方式,叫做 UTF-16 (因为 16 位 = 2 字节)。UTF-16 将 0–65535 范围内的字符编码成 2 个字节,如果真的需要表达那些很少使用的 "星芒层 (astral plane)" 内超过这 65535 范围的 Unicode 字符,则需要使用一些诡异的技巧来实现。UTF-16 编码最明显的优点是它在空间效率上比 UTF-32 高两倍,因为每个字符只需要 2 个字节来存储(除去 65535 范围以外的),而不是 UTF-32 中的 4 个字节。


UTF-8 使用一至四个字节为每个字符编码:

128 个 US-ASCII 字符只需一个字节编码(Unicode 范围由 U+0000 至 U+007F)。

带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode 范围由 U+0080 至 U+07FF)。

其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。

其他极少使用的 Unicode 辅助平面的字符使用四字节编码。

5. 扩展思考

utf-8 有什么优缺点?

优点:

UTF-8 是 ASCII 的一个超集。因为一个纯 ASCII 字符串也是一个合法的 UTF-8 字符串,所以现存的 ASCII 文本不需要转换。为传统的扩展 ASCII 字符集设计的软件通常可以不经修改或很少修改就能与 UTF-8 一起使用。

使用标准的面向字节的排序例程对 UTF-8 排序将产生与基于 Unicode 代码点排序相同的结果。(尽管这只有有限的有用性,因为在任何特定语言或文化下都不太可能有仍可接受的文字排列顺序。)

UTF-8 和 UTF-16 都是可扩展标记语言文档的标准编码。所有其它编码都必须通过显式或文本声明来指定。

任何面向字节的字符串搜索算法都可以用于 UTF-8 的数据(只要输入仅由完整的 UTF-8 字符组成)。但是,对于包含字符记数的正则表达式或其它结构必须小心。

缺点:

因为每个字符使用不同数量的字节编码,所以寻找串中第 N 个字符是一个 O (N) 复杂度的操作 — 即,串越长,则需要更多的时间来定位特定的字符。同时,还需要位变换来把字符编码成字节,把字节解码成字符。

7. 参考文献

8. 更多讨论

js 中如何使用 unicode

【更多内容,可以加入IT交流群565734203与大家一起讨论交流】

【这里是技能树·IT修真院:IT修真院官网,初学者转行到互联网的聚集地】

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/89210063