前言
最近遇到了几个编码转换的问题,为什么会出现乱码呢?就想搞清楚计算机是如何“认字”的,查查资料进行总结。
提一嘴
- bit(位),计算机中数据的最小单位,0或1。
- byte(字节),1 byte = 8 bit。
- 字符,例如:A,1,国 等具体的文字符号。
编码的历史
早期的尝试:打孔卡与电报码
在计算机出现之前,信息就已经开始以编码的形式被传输和处理了。例如,打孔卡技术在19世纪末至20世纪中叶广泛应用于数据输入领域。每张卡片上的孔代表不同的字符或指令。同样,摩尔斯电码也是一种早期的信息编码形式,它通过点和划的不同组合来表示字母、数字和符号。
ASCII的诞生(1963年)
随着计算机的发展,对一种标准化的字符编码系统的需求变得日益迫切。1963年,美国国家标准协会(ANSI)发布了ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。ASCII使用7位二进制数来表示128种不同的字符,包括英文字母、阿拉伯数字、标点符号以及一些控制字符。这为不同制造商生产的计算机之间提供了一种通用的语言。
一个字节可以表示256个符号,从 00000000
到 11111111
。而 ASCII 只规定了 128 个字符,只占用了一个字节的后 7 位,最前面一位统一规定为 0,例如:大写字母 A 是 65(二进制 01000001)。
扩展ASCII与ISO-8859
尽管ASCII满足了基本需求,但它仅限于英语和其他西欧语言。为了支持更多语言,人们开发了扩展ASCII,它利用8位二进制数提供了额外的128个字符位置。然而,这些额外的位置并未统一,导致了多种不兼容的编码方案的产生。ISO/IEC 8859
系列试图解决这个问题,通过定义多个子集来覆盖不同的语言和地区。
例如:法语在字母上方是有注音符号的,用 ASCII 码就无法表示,那法国人就不同意了,自己整了一套规则,放在一个字节中未被 ASCII
使用的那 128
位上。
那你法国这样,我希伯来语怎么表示,我也来整一套规则,那 130 这个值在不同的地方显示的符号就不同了,法国是 é
,希伯来是 ג
但是他们不管怎么变,0--127
表示的符号是一样的,不一样的只是 128--255
的这一段。
Unicode的革命(1991年)
随着全球化的推进,对于能够支持世界上所有书写系统的单一编码标准的需求越来越强烈。Unicode联盟于1991年推出了Unicode标准,最初设计为使用16位来表示每个字符,理论上可以支持超过65000个字符。随着时间的发展,Unicode不断扩展,现在它可以使用多达32位来表示一个字符,足以涵盖几乎所有已知的文字系统。
Unicode 的表示方式 U+十六进制
,例如:U+0639 表示阿拉伯字母 Ain,U+0041 表示英语的大写字母 A,U+4E25 表示汉字 严。
UTF-8及其他编码格式
虽然Unicode解决了多语言支持的问题,但它的原始实现(UTF-16)并不总是最适合互联网使用的。UTF-8作为一种变长的字符编码方式应运而生,它不仅向前兼容ASCII,而且可以根据需要动态调整字符长度,使得它非常适合用于网络传输和存储。如今,UTF-8
已经成为网页中最常用的字符编码格式之一。
变长的编码方式,它可以使用 1~4
个字节表示一个字符,规则如下:
- 对于单字节的符号,字