“手持两把锟斤拷,口中疾呼烫烫烫!”

前言

和群友吹水时看到的,给我整笑了

万 恶 之 源

锟斤拷 17 锟斤拷 锟斤拷锟斤拷 HTTP 锟斤拷锟斤拷 (oracle.com)

为防止Oracle修复,传了一份到WebArchiveWayback Machine

话说回来,为啥会有这玩意?单纯的乱码,还是浏览器抽风?

编码

具体内容可以参阅《计算机组成原理》

ASCII

计算机会处理各种各样的字符:英文、中文…为了区分记录它们,产生了不同的编码,如繁体的BIG5,或者中文的GBK

对于英文的26个字母、10个数字和少数标点,很轻松就能把他们全记下来:1、2、3.……但在计算机底层,实际上用01进行存储。ASCII编码会将所有的字母及符号进行编码,之后转成二进制的01进行存储,字母和符号占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的过程中出现了问题。当然,必须有两个及以上字符才能出现锟斤拷。

那烫烫烫呢?

下次再说