Unicode 与 UTF 学习记录

本文介绍了Unicode编码系统的背景和发展,详细解释了Unicode如何通过统一全球字符编码解决了不同地区间字符编码互不兼容的问题。同时,文章还对比了Unicode的不同实现方式,如UTF-8、UTF-16和UTF-32等编码格式的特点。

Unicode(Universal Multiple-Octet Coded Character Set)

Unicode,简称 UCS, 又称统一码、万国码、单一码。
当时各个国家都搞出一套自己的编码标准, 结果互相之间谁也不懂谁的编码,谁也不支持别人的编码。于是 ISO (国际标谁化组织)的国际组织决定着手解决这个问题,废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码, 直接规定必须用两个字节,也就是16位来统一表示所有的字符。

在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符, "U+"必须随后紧接着四位数。Unicode的编码范围从U+0000到U+10FFFF,共有1,112,064个码位(code point)可用来映射字符,Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。

17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从00到10,共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区块是永久保留不映射到Unicode字符。

相比 ASCII 里的那些”半角”字符,Unicode 保持其原编码不变,只是将其长度由原来的8位扩展为16位。

Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
所以会存在一些问题:
1、难以区别 Unicode 和 ASCII。
2、对于存储来说是极大的浪费,因为 英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,文本文件的大小会因此大出二三倍。

结果出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode; 在很长一段时间内无法推广。
之后就出现了一种统一的编码方式 UTF-8 成为使用最广的一种Unicode的实现方式。
其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。

UTF(Unicode Transformation Format, Unicode转换格式)

UTF-8

可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

编码规则
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
所以如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
在这里插入图片描述

UTF-16

也是一种变长的编码方式,它可以使用两个字节或四个字节来表示一个符号。

UTF-16编码实现方式中使用了大端序(Big-Endian,简写为UTF-16 BE)、小端序(Little-Endian,简写为UTF-16 LE)的概念。

Little endian 和 Big endian

例如Unicode 码 ‘4E25’ ,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,这就是 Big endian 方式;25在前,4E在后,这是 Little endian 方式。

Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FF比FE大1。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大端序方式;
如果头两个字节是FF FE,就表示该文件采用小端序方式。

UTF-32

与其他UTF相比,UTF-32的编码长度是固定的,UTF-32中的每个32位值代表一个Unicode码位,并且与该码位的数值完全一致。
UTF-32可以直接由Unicode码位来索引,相比之下,其他可变长度编码需要进行"循序访问"操作才能在编码序列中找到第N个编码。
但是UTF-32每个码位使用四个字节,空间浪费较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goodric

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值