锟斤拷为什么这么烫?
“手持两把锟斤拷,口中疾呼烫烫烫!”
前言
和群友吹水时看到的,给我整笑了
锟斤拷 17 锟斤拷 锟斤拷锟斤拷 HTTP 锟斤拷锟斤拷 (oracle.com)
为防止Oracle修复,传了一份到WebArchiveWayback Machine
话说回来,为啥会有这玩意?单纯的乱码,还是浏览器抽风?
编码
具体内容可以参阅《计算机组成原理》
ASCII
计算机会处理各种各样的字符:英文、中文...为了区分记录它们,产生了不同的编码,如繁体的BIG5
,或者中文的GBK
。
对于英文的26个字母、10个数字和少数标点,很轻松就能把他们全记下来:1、2、3.……但在计算机底层,实际上用0
和1
进行存储。ASCII编码会将所有的字母及符号进行编码,之后转成二进制的0
和1
进行存储,字母和符号占1个字节(即8bit)。
标准的ASCII码规定最高位必须为0
,因此ASCII编码只能有128个,转成十进制即为0-127。
英语是没问题了,但其他的语言呢?一种全球通用的编码方式亟待指定。Unicode
应运而生。
Unicode
Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准。它为每种语言中的每个字符设定了统一并且唯一的二进制编码。在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这个字符。
Unicode是一种可变长度字符编码,它可以用来表示Unicode
标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容。这蛮好的,不用把以前的推翻了重来。
但凡事有个先来后到。UTF-8
是针对Unicode
的一种可变长度的字符编码,它包含了世界上所有字符的编码,但那些早录入的字符,就会优先使用1、2个字节来存储。后面来的只能乖乖往后排,因此会占用更多的字符量。对于中文,很可能一个汉字使用三个字节进行编码,这对于网页是灾难性的:一个中文网站只有中文和一点点英文及数字,却需要很多的字节来记录。非常糟糕,不是吗?
为了解决这个问题,GBK编码出现了。
GBK
中华人民共和国全国信息技术标准化技术委员会制定了一套GB系列的编码,其中最常用的就是GBK
。
对于英文,GBK
使用单字节编码,完全兼容ASCII字符;而汉字使用两个字节进行编码,其编码范围从0x8140至0xFEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,图形符号 883 个。
为什么要删除
xx7F
?这玩意对应的ASCII码表是DEL
,意味着要向后删除一个字符。很神奇吧
锟斤拷、锟斤拷,锟斤拷?
Unicode编码也在不断发展,可能会出现各种操作系统支持的Unicode字符不一样。为了避免这个问题,Unicode中定义了一个特殊字符�,编码为0xFFFD
。而它用UTF-8编码之后,十六进制表示为0xEF 0XBF 0XBD
。若连续两个,则变成0xEF 0XBF 0XBD 0xEF 0XBF 0XBD
。发现了吗?
0xEF 0XBF 0XBD 0xEF 0XBF 0XBD
这是 � �
0xEF 0XBF 0XBD 0xEF 0XBF 0XBD
这是 锟斤拷
因此,出现锟斤拷的原因就是UTF-8转码GBK的过程中出现了问题。当然,必须有两个及以上字符才能出现锟斤拷。
那烫烫烫呢?
下次再说