主题:218-Dylan Beattie:论纯文本 -- 万年看客
共:💬6 🌺27 新:
全看 分页 树展 · 主题 跟帖
家园

这套UTF-16编码系统是绝大多数操作系统内部使用的系统,在台式机上、笔记本上以及本地存储上都运行得非常良好。因为这套体系非常快。但是一旦到了互联网上,取舍平衡就要有所变动,因为在网上带宽要比内存更重要。我们要将浏览网页与收发邮件时来回传输的信息量压到最低。比方说我们看看这个网页的代码:

<! DOCTYPE html><html>

<head>

<title>привіт!</title></head>

<body>

<h1>привіт!</h1></ body>

</ html>

按照UTF-16,这段代码包含如下信息:

003C 0021 0044 004F 0043 0054 0059 0050 0045 0020 0068 0074 006D 006C 003E 000A 003C 0068 0074 006D 006C 003E 000A 003C 0068 0065 0061 0064 003E 000A 0020 0020 003C 0074 0069 0074 006C 0065 003E 041F 0440 0438 0432 0456 0442 0021 003C 002F 0074 0069 0074 006C 0065 003E 000A 003C 002F 0068 0065 0061 0064 003E 00BA 003C 0062 006F 0064 0079 003E 00OA 0020 0020 003C 0068 0031 003E 041F 0440 6438 0432 0456 0442 0021 003C 002F 0068 0031 003E 000A 003C 002F 0062 006F 0064 0079 003E 000A 003C 002F 0068 0074 006D 006C 003E 000A

这个网页上的所有人眼能够看到的文本都是用西里尔字母拼写的乌克兰语,但这是一个基于ASCII的HTML网页,而ASCII又只使用7比特127字符的编码体系,所以体现网页上可见文字привіт的比特——041F,0440,0438,0432,0456,0442——必须要用统一码来表示。至于其他这些比特,我们发送的一半信息都是00。当然这些00也必须存在,因为如果删掉的话我们的事件日志里就会出现中文。但是估算一下,这个UTF-16文件当中44%的内容都是空值。就算你的文件的语言并非基于ASCII,你所有的标记、标签、引号、HTML属性、CSS以及JavaScript——你可以试试用西里尔字母乌克兰语写JavaScript,这并不是你能想象到的最愚蠢的活动,但是至少也能排到前十——依然必须基于ASCII。所以我们需要的编码系统需要避免在主要基于ASCII文本的编码格式上浪费太多时间。于是UTF-8应运而生,这是一套非常高明的规则。根据这套规则,如果你看到一个字节以0开头,这就是一个7比特的ASCII字节。也就是说在登月之前的所有ASCII电子文档全都拥有有效的UTF-8代码,什么都不用修改;假如一个字符以1开头,那就说明这个字符是一个多字节代码序列。假如一个字节的开头是10,说明这个字节是对应字符的后半段,想看前半段还得倒退一下;如果字节以110开头,意味着这是由两个字节组成的序列开端,整个字符是110XXXXX 10XXXXXX,X用来表示数字值;如果字节开端是1110,那这就是三字节编码序列110XXXXX 10XXXXXX 10XXXXXX;如果是11110,那就是四字节编码序列。UTF-8的编码规则就到此为止。我们当然可以取值更高,例如UTF64或者UTF128,将这套体系一直扩增到八字节编码,不过就算目前我们也足以容纳人类古往今来一切语言当中一切字母表里的一切字符。就算日后我们碰上友好的外星人,我们也可以利用这套体系的空余空间来回发送外星语邮件。

换句话说,我们可以利用UTF-8来发明新语言。有人说我们并不会发明新语言,但我们确实会。表情包就是在我的有生之年发明出来的新语言,你们有些人今天大概还刚刚用过。表情包最早在1999年由日本艺术家栗田穰崇率先推出。他为日本规模最大的手机运营商DoCoMo设计了iMode,本意是想让天气预报与交通状况通报看上去更有趣一些。这就是他设计的全世界第一套表情包,现在收录在纽约当代艺术博物馆。不出六个月没装表情包的手机在日本就卖不出去,因此2008年iPhone在日本推出时也支持了表情包。然后世界各地的苹果用户发现,如果将自己的设备设定为支持日语的话,就可以使用这些可爱的字符。你给朋友发过短信之后他们会非常奇怪地反问你“你怎么给我发了个小人的笑脸?你怎么给我发了个绿脸的魔鬼?”这一来就催生了很多问题,比方说有人问“为什么我的表情包支持寿司却不支持墨西哥卷饼?”也有人说“为什么飞行员、医生、工程师表情全都是男性?”再进一步,“这些人究竟是白人男性还是黄人男性?”无论哪个答案都会让好多人不满意。显然表情包并不特别擅长让用户彰显自己的身份。2015年统一码向前走了一大步,引入了调整表情肤色的能力,具体做法也是组合字符,就像Mötley Crüe一样。将一个竖大拇指表情U+1F44D与一个深色背景色U+1F3FE结合在一起,就得到了一只棕色的大拇指。每年都有全新的表情被加入统一码的参数当中,现在的表情包覆盖了各种性别身份,各种家庭成员关系,各种职业等等。具体做法非常高明,利用了各种编码体系的深层机制。比方说女性宇航员这个表情的统一码是一个女性头像U+1F469加一个零宽连字符U+200D,再加一个火箭U+1F680D。如果将这个表情发送给持有老式安卓手机的用户,他们只会接收到一个女性头像再加一个火箭。如果对方用的是新式安卓手机,则会看到一个女性宇航员。甚至你还可以调整宇航员的肤色。因此奋进号航天飞机宇航员梅.杰米森的官方表情就是女性头像加深色背景色加零宽连字符加火箭。

表情包真正大显身手之处在于旗帜。比方说丹麦国旗,丹麦的ISO国家代码是DK,因此丹麦国旗表情的代码是区域指示符D——U+1F1E9——加上区域指示符K——U+1F1F0。根据国际标准组织的定义,英格兰不算一个国家——别问了,这个事儿一两句话说不清楚——但是英格兰的圣乔治旗也被做成了表情,不过并非借助区域指示符。1992年有人向统一码引入了字母标记,结果没人使用。后来又有人想把这套内容去掉,结果被制止了:“别去掉别去掉,英格兰的旗帜需要这套系统。”圣乔治旗就是黑旗U+1F3F4加上字母标记G、B、E、N、G。苏格兰国旗,威尔士国旗,乃至于德州州旗用的都是这种方法。目前只有这四面旗采用了这种编码方式。

但是并未受到联合国认可的旗帜也有自己的编码方式,比方说彩虹骄傲旗是白旗U+1F3F3加零宽连字符加彩虹U+1F308。再来看看青天白日旗,这是代表中华民国的旗帜,不能与中华人民共和国的国旗相混淆。青天白日旗在中国大陆象征着支持台湾独立,而他们对此很不待见。假设你用的是英语iPhone手机,输入Taiwan就会自动蹦出青天白日的表情。但是苹果公司也想在中国大陆卖手机,因为中国大陆住了35亿人,其中很多人都是iPhone的潜在顾客。所以如果你在苹果手机上将地区设定为中国大陆,这面旗就消失了。这就是苹果为了在大陆销售手机而做出的妥协方案。微软的方案还要更进一步。如果你现在看看我的推特主页,可以看到我的用户名后面跟着一面丹麦国旗,因为推特会显示你目前所在的地区。但是推特的网页界面并不会用操作系统来画表情。推特网页界面上的表情都是png格式图像,是网站的一部分。如果你在Mac电脑编辑推特用户主页,能够看到我的用户名后面的丹麦国旗;在Windows系统里,用户名后面只有DK两个字母。因为Windows决定“我们可不想掺和什么中国台湾之类的破事”。所以微软Windows的表情包不会显示任何国旗,今后大概也永远不会显示。Windows操作系统只支持三面旗,第一面是彩虹旗,第二面是骷髅头海盗棋,第三面是标志F1方程式率先冲线的黑白格旗。换句话说Windows的宗旨说明主张只有同志海盗能夺得冠军,其他人都可以一边凉快去。这种做法我也不是不能理解,想必让他们免除了很多复杂的会议纠纷。

……

我在讲座一开始提到过今天的讲座的大部分内容是我在多年游历当中学到的。2016年我第一次前往乌克兰,当时我完全不懂西里尔字母,从那以后我才开始自学俄语。我刚到乌克兰的时候看不懂菜单,看不懂路标,但是我能看懂车牌。于是我研究了一下,却原来在1965年——也就是ASCII问世那一年——召开了一场维也纳公路交通大会,欧洲各国都签署了这项公约,同意施行同一套交通规则,以便让车辆能够自由往来于各国之间。维也纳公约的要求之一是车牌只能使用拉丁字母,而1965年苏联车牌看上去长这样。苏联也是维也纳公约的签署国之一,我想在苏联肯定也有人讨论过“如果有人想开离开苏联怎么办?”然后肯定有人说“这不可能,谁也别想开车离开苏联。”但是如果你当真搞到了驾车出境的文件,当局会为你颁发临时车牌,从而让你的车能够顺利出境——当然如果你的车没能回来的话,你的家人很可能被送去古拉格。1991年苏联解体之后,前苏联各位加盟国,乌克兰,俄罗斯,白俄罗斯等等全都更改了自己的车辆注册体系。他们将西里尔字母与拉丁字母摆在一起,然后找出了两套字母表当中都存在的图形——BEXMKHTPIACO——用来给车辆登记。我在乌克兰的车牌上也看到了将这十二个字母。将它们重新排序,就得到了PIKE MATCHBOX这个词。下次如果再有人说“我要给你发一个纯文本文档”,那么你不妨问一句:“你知道PIKE MATCHBOX吗?”如果他们说知道,那就万事大吉,想必他们也知道大端字节序与小端字节序,知道UTF-8与UTF-16的区别,知道ASCII的发展史,知道Kohuept,知道字符编码,知道西里尔字母代码页。如果他们说“PIKE MATCHBOX是什么东西?”那么他们尽管可以给你发送出文本文件,但是打得开打不开就要看运气了。谢谢大家。

通宝推:sywyang,史文恭,
帖:4794434 复 4794432
全看 分页 树展 · 主题 跟帖