你真的了解 Unicode 和 UTF-8 吗?

目录

  • 引言
  • ASCII 码
    • 什么是 ASCII 码?
    • ASCII 码都包含哪些字符?
    • ASCII 码的局限在哪里?
  • Unicode
    • 什么是 Unicode ?
    • Unicode 的实现方式有几种?
    • Unicode 的体系结构是什么样的?
    • UTF-8 编码
    • UCS-2 编码
    • UTF-16 编码
    • UTF-32 编码
  • 小结
  • 参考文档

引言

一直以来总是对 unicode, UTF-8 等编码知识懵懵懂懂的,尤其是在做项目过程中只要涉及到几个编码之间的转换,都得到网上搜索一番,根据别人的经验照葫芦画瓢,才能解决问题,但是私底下却完全不懂在做什么。

我再也不愿意重复这种状态了,于是就花了一个上午的时间,将这些知识整理了一遍。如果您觉得我的总结有疑问或者错误的地方,欢迎讨论交流,批评指正。

正题之前,先引入我总结的 Unicode 思维导图来预热下:

要了解 Unicode, 先要从 ASCII 码说起。

ASCII 码

什么是 ASCII 码?

ASCII 码(American Standard Code for Information Interchange)称为美国标准信息交换码。它是基于拉丁字母的一套电脑编码系统。它定义了一个用于代表常见字符的字典。

ASCII 码都包含哪些字符?

包括 "A-Z"(大小写都包含),数据"0-9" 以及一些常见的符号,要完整查看整个 ASCII 码对应关系,可参考这里

ASCII 码的局限在哪里?

ASCII 当初只是为美国英语而设计的,只能显示 128 个编码,对其他的语言无能为力。要想显示其他语言的编码,还是要使用 unicode。

Unicode

什么是 Unicode ?

为了将全世界的文字都统一的记录下来,并将每个字符都用唯一的数字记录下来,于是就产生了Unicode。

Unicode 也称为 UCS(Universal Coded Character Set:国际编码字符集合) 是一个字符集合,对世界上大部分的文字系统进行了整理,编码,使电脑可以用更为简单的方式来呈现和处理文字。最新的版本 Unicode 11.0 已经包含了 137439 个字符。

Unicode 的数量之多,如果完全涵盖它, 需要用 4 个字节来表示,但是计算机存储过程中却不是必须都用 4 个字节来完成。对于有些字符,尤其是编码在前面的字符我们也可以通过 1 个或 两个字节来节省空间。这就涉及到了 unicode 的实现方式。

Unicode 的实现方式有几种?

Unicode 只是一个字符集合,每个字符用一个数字来表示,但是这些数字在计算机内采用什么方式来存储,是全部都是 4 个字节,还是 1 到 4 个字节不等,这就涉及到了字符编码的概念。

我们说 Unicode 有几种实现方式,也就是在问 Unicode 有几种编码方式?

Unicode 常用的编码方式有 UTF-8, UCS-2, UTF-16 三种,另外还有一种 UTF-32 虽然不太常用也需要提一下。

Unicode 的体系结构是什么样的?

Unicode 既然能够存储那么多的字符,肯定是有它的存储规则的,如果使用 16 进制存储,它的存储范围是多少到多少,是否都是直筒式的,从低到高排就可以了?也就是说 Unicode 的体系结构是怎么样的。

Unicode 当前定义其字符的存储范围是: 0hex 到 10FFFFhex ,共分为 17 个区段,可以存储 1,114,112 个字符,这对当前 (137439) 来说远远足够了。

其中区段为 0hex 到 FFFFhex 称为 基本多文种平面 BMP (Basic Multilingual Plane),在这个平面中的字符表现形式是 U+ 后面跟 16 进制数。例如 X 字符的 unicode 是 U+0058

而超出 BMP 范围的,也就是 10000hex–10FFFFhex 这 16 个区段,需要用到 5 到 6 位来表示,如 U+E0001U+10FFFD

UTF-8 编码

UTF-8 是使用互联网上使用最广泛的 unicode 编码方式,目前已经占有整个互联网 92% 的份额。这里再强调下 UTF-8 只是 Unicode 的一种实现方式,UTF-8 是编码方式,而 Unicode 是字符集合

它是可变长的编码方式,长度从 1 个字节到 4 个字节不等。

它能够完全兼容 ASCII 码,我们知道 ASCII 码 是由 128 个字符组成的,而 Unicode 中的前 128 个字符和 ASCII 码都是一一对应的。

UCS-2 编码

UCS-2 只使用了两个字节(16 bit) 来表示字符,也就是说只能表示 65536 个字符,它只能表示 BMP 中的字符。

当前的 unicode 字符数量已远远超过了 UCS-2 的数量,因此 UCS-2 虽然还在被好多软件使用,但它已经过期了。

正因为 UCS-2 编码依然被许多软件使用,为了能够表示出 BMP 以外的平面内的字符,就产生了一种新的编码 UTF-16 编码。

UTF-16 编码

UTF-16 就是为了解决 UCS-2 编码的问题而生的,它扩展自 UCS-2

  • 基本多文种平面中,与 UCS-2 编码完全一致,使用两个字节表示
  • U+010000U+10FFFF 范围 使用 4 个字节表示

UTF-16 编码的市场份额和 UTF-8 比很小, 在web 页面中只占 0.01% 。而且主要在 windows 系统中使用, Unix/Linux 以及 MacOS 中很少使用。

UTF-32 编码

UTF-32 对 Unicode 中的每个字符都用 4 个字节来表示,占用的空间比其他编码要多的多,也正是这个原因,人们才用的很少。

小结

前面讲了那么多,再贴下 unicode 思维导图,来总结下

参考文档

  1. 维基百科 Unicode

原文地址:https://www.cnblogs.com/reycg-blog/p/10021658.html

时间: 2024-08-29 00:40:28

你真的了解 Unicode 和 UTF-8 吗?的相关文章

ascii、unicode、utf、gb等编码详解

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定

Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".

java中的char中unicode和utf的关系

char是Java的基础类型(原类型 ),是字符类型.在Java中字符是基于Unicode编码的,所以一个Java的字符占2个字节,字符的内容存的是unicode的码值(二进制数字).问题来了,程序是怎么把unicode的码值转换为我们要的程序数据?例如:汉字的'汉'对应的unicode码值为:0x6C49.我们想要的程序数据为'汉',而计算机存储的为码值.如何把码值‘0x6c49’显示为‘字’,需要一个转换过程. 这个转换过程需要一个转换规则.转换规则的书面写法为UTF(UCS Transfo

Unicode 与 UTF 字符标准

Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示.        Unicode用两个字节表示一个字符.前127个字符与ASCII标准一样,前256个字符符合ISO 8859-1标准.                UTF (UCS Transformation Format)提供的 Unicode 字符的表示法对文件系统都是安全的.UTF-8 使用一个字节表示常用的7位ASCII字符,用两个字节表示8位ASCII字符

Unicode 与 UTF

[UCS]   Universal Character Set (通用字符集) [UCS]   Unicode Character Set  (Unicode字符集) [UTF-8]Unicode/UCS Transformation Format-8 说明,由于UTF也适用于编码通用字符集UCS,故亦可称为『UCS transformation formats (UTF)』 Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它是基于通用字符集(Universal Char

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

好文分享UTF-8, 字符集, 编解码 (关于字符编码的深入解释,请参见我的原创文章<关于字符编码,你所需要知道的>.) 此文为转载,有少许修订,原文出处不详. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"

字符编码笔记:ASCII,Unicode和UTF-8

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约

Java Core 学习笔记——3.char/Unicode/代码点/代码单元

通用字符集(UCS) UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集. UCS包括了其他所有的字符集(包含了已知语言的所以字符). ISO/IEC 10646定义了一个31位的字符集(首位恒定为0,占用4字节). Unicode(万国码.国际码.统一码.单一码) 编码方式: Unicode编码空间从“U+0000”到“U+10FFFF”(共1112064个码位),Unicode的编码空间划为17个平面,每个平面包含216(65536)个码位.17

【转】【编码】ANSI,ASCII,Unicode,UTF8

不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码:在繁体中文Windows操作系统中,ANSI编码代表Big5:在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码.不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,