字符编码

这篇博客深入探讨了字符编码的不同标准,包括ASCII、Unicode、UTF-8、UTF-16和UTF-32。ASCII是早期的字符编码,仅包含128个字符;Unicode扩大了字符范围,收录全球字符;UTF-8是一种变长编码,适合网页和电子邮件;UTF-16则用2或4个字节表示字符,而UTF-32则直接按码点存储。文件的编码识别通常通过文件头的特定字节序列来确定。
摘要由CSDN通过智能技术生成

众所周知,计算机只能识别01串,字符在计算机以01串的形式存储,所以每个字符要用唯一的01串表示,这个过程称为字符编码

ASCII(American Standard Code for Information Interchange)美国信息交换标准码

由ANSI(American National Standard Institute)美国国家标准协会制定,1967年发布,主要用于显示英语和其他西欧语言,共收录了128个字符。后被ISO(International Organization for Standardization)国际标准化组织定为国际标准,称为ISO 646标准。由于ASCII只含有128个字符,使用1个字节就能表示全部的字符

UCS(Universal Character Set)通用字符集

由ISO制定的ISO 10646标准所定义的字符编码方式,与Unicode基本相同,UCS-2是使用2个字节来表示一个字符,是UTF-16的子集,UCS-4与UTF-32相同

Unicode(万国码、统一码)

由于ASCII的局限性,无法支持中文、日文等字符,各国分别制定了自己的编码标准,不同的编码标准使得交互很麻烦,统一码联盟为了解决这个问题,制定了Unicode,收录了世界上所有的字符,可以将它看成一个字符集。

每个字符与一个值对应,这个值称为码点,前128个字符与ASCII相同,以汉字‘汉’为例,它的 Unicode 码点是 0x6C49,记为U+6C49,Unicode只规定了字符对应的码点的值,并没有规定码点在计算机怎么存储。

UTF-8、UTF-16和UTF-32是常见的Unicode的实现方式,这些编码规定了码点在计算机中怎么存储(最终的01串)

UTF-8

UTF-8 是变长码,不同的字符使用的字节数可能不同,例如ASCII码占用1个字节,汉字占用3个字节。这个字节数与字符对应的码点的大小有关,码点小的使用的字节就少,码点大的使用的字节就多,使用的字节个数从 1 到 4 个不等,具有很强的扩展性。
UTF-8 的编码规则是:

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

② 对于n字节的符号 (n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

UTF-16

UTF-16也是变长码,每个码元单位为2个字节,每个字符可能占用1或2个码元单位,即2个或4个字节,对于码点值在U+0000和U+FFFF内的字符,使用一个码元单位,对于码点值在U+10000和U+10FFFF内的字符,使用两个码元单位。

当我们遇到两个字节时,到底是把这两个字节当作一个字符还是与后面的两个字节一起当作一个字符呢?

这里有一个很巧妙的地方,在基本平面内,从 U+D800 到 U+DFFF 是一个空段,即这些码点不对应任何字符。因此,这个空段可以用来映射辅助平面的字符。

辅助平面的字符位共有 2^20个,因此表示这些字符至少需要 20 个二进制位。UTF-16 将这 20 个二进制位分成两半,前 10 位映射在 U+D800 到 U+DBFF,称为高位(H),后 10 位映射在 U+DC00 到 U+DFFF,称为低位(L)。这意味着,一个辅助平面的字符,被拆成两个基本平面的字符表示。

因此,当我们遇到两个字节,发现它的码点在 U+D800 到 U+DBFF 之间,就可以断定,紧跟在后面的两个字节的码点,应该在 U+DC00 到 U+DFFF 之间,这四个字节必须放在一起解读。

UTF-32

直接按照码点值存储,每个字符占用4个字节

文件编码格式

对于一个文件,我们可以读取文件开头来判断它的编码方式:

EF BB BF    UTF-8
FE FF     UTF-16/UCS-2,little endian
FF FE     UTF-16/UCS-2,big endian
FF FE 00 00  UTF-32/UCS-4,little endian
00 00 FE FF  UTF-32/UCS-4,big endian

big endian(大端存储):先存储高位字节

little endian(小端存储):先存储低位字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值