阮一峰的文章有哪些常见性错误

2017-02-27 20:48:40 +08:00
 lzjun

比如《字符编码笔记: ASCII , Unicode 和 UTF-8 》 是阮老师 10 年前写的一篇关于字符编码的科普文章,现在用 Google 搜关键字该文章依然名列前茅,可见他的文章有多大影响力,但里面的内容是否正确是值得商榷的事。

中文维基百科对 Unicode 的解释也是让人一头雾水,摸不着头脑。看看阮老师怎么说:

可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode ,就像它的名字都表示的,这是一种所有符号的编码。

这句话读起来很拗口,有三个地方出现了「编码」二字。不知阮老师对「编码」的理解是什么?但可以肯定的是这三个「编码」在这句话里面不是同一个意思。

「编码」作动词使用时就是把一个字符(严格一点说是字符在字符集中的编号 code point )转换成一个字节序列,以便在网络传输或者存储到文本中。比如「好」在 Unicode 中的编号是 U+597d ,经过 UTF-8 编码后会转换成二进制序列是 '\xe5\xa5\xbd' 。作为名词使用时,就是指一种具体的编码实现方式,比如 ASCII 编码, GBK 编码, UTF-8 编码

其实 Unicode 是一个囊括了世界上所有字符的字符集,其中每一个字符都对应有唯一的编码值( code point ),然而它并不是一种什么编码格式,仅仅是字符集而已。 Unicode 字符要存储要传输怎么办,它不管,可以用 UTF-8 、 UTF-16 。

再来看阮老师说 Unicode 的第二个问题:

第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0 ,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

Unicode 并没有统一规定每个符号用三个或者四个字节表示。 Unicode 只规定了每个字符对应到唯一的代码值( code point ),代码值 从 0000 ~ 10FFFF 共 1114112 个值 ,真正存储的时候需要多少个字节是由具体的编码格式决定的。比如:字符 「 A 」用 UTF-8 的格式编码来存储就只占用 1 个字节,用 UTF-16 就占用 2 个字节,而用 UTF-32 存储就占用 4 个字节。

再看来看这张图:

阮老师对 Unicode 编码的解释是:

Unicode 编码指的是 UCS-2 编码方式,即直接用两个字节存入字符的 Unicode 码。这个选项用的 little endian 格式。

UCS-2 是什么鬼, UCS-2 是使用两个定长的字节来表示一个字符,而 UTF-16 是使用两个变长的字节,遇到两个字节没法表示时,会用 4 个字节来表示,因此 UTF-16 可以看作是在 UCS-2 的基础上扩展而来的。而 UTF-32 与 USC-4 是完全等价的。

之所以在 Windows 下有 Unicode 编码这样一种说法,其实是 Windows 的一种错误表示方法,它真正的编码类型是 UTF-16LE 编码。

他又说:

Unicode 规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"( ZERO WIDTH NO-BREAK SPACE ),用 FEFF 表示。这正好是两个字节,而且 FF 比 FE 大 1 。

如果一个文本文件的头两个字节是 FE FF ,就表示该文件采用大头方式;如果头两个字节是 FF FE ,就表示该文件采用小头方式

这儿就错得更加离谱了,不想说了,直接原文链接 http://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366798&idx=1&sn=5db3b152c99ff96f7a477313cfb175e0&chksm=be9cd81a89eb510c1d22091d89df648ab689a01fd77ebd4361567dd7ec238e754c3d5f10715c&mpshare=1&scene=23&srcid=0227ViQqcIpvWmVwkOiYxyxT#rd

17788 次点击
所在节点    程序员
115 条回复
Yc1992
2017-02-27 22:39:02 +08:00
有必要 @谭浩强
ecmadao
2017-02-27 22:41:59 +08:00
讲真,我觉得他的一些文章算是一种“搬运工”的水准,但我们应该辨证的看待。对于小白而言,他的文章的确显得很新,可以作为粗浅的入门,但是比较有经验的人可能就不太能看得上了。我自己从前入门的时候还会看看那些文章,但后来就觉得其实写的很浅,也只是汇总了网上资料的水平。而对于文中的错误,指出来是绝对没问题的,人非圣贤孰能无过嘛,但总有人带着戾气进行攻击,同时也有人盲目崇拜,这就真心不该了
laoyuan
2017-02-27 22:45:54 +08:00
我觉得,谁要是讲编码的时候,能提到 MySQL 的 utf8 并不支持所有 UTF-8 , utf8mb4 才相当于 UTF-8 ,那么,他的水平是有的
kuntang
2017-02-27 22:48:40 +08:00
@laoyuan utf8mb4 是包含表情符号吗
mimzy
2017-02-27 22:49:18 +08:00
@laoyuan #23 我第一次是从 Livid 那里学到的 2333 /t/137724
FrankFang128
2017-02-27 22:49:36 +08:00
@qingshi 写了十年的博客之后,才做的程序员。
ljcarsenal
2017-02-27 22:50:28 +08:00
@FrankFang128 他在阿里的 title 不是前端开发专家么
binss
2017-02-27 22:53:24 +08:00
@kuntang emoji 要 4 个 byte ,之前网站被 emoji 搞挂过一次...
crab
2017-02-27 22:55:45 +08:00
@lzjun 那他说这个开头的 2 个字节大小端描述也确实没错啊。
laoyuan
2017-02-27 23:03:45 +08:00
可能大家接触 utf8mb4 多是储存 Emoji 的需求,我是碰到不常用汉字了, 4 字节 UTF-8 的汉字,插入数据库报错,我很早就碰到了,当时 MySQL 还没出到 5.5 ,后来有一天我突然想上 V2 来问问,就有人告诉我用 utf8mb4 了
kuntang
2017-02-27 23:03:46 +08:00
@ljcarsenal 授予专家的 title 更多的看重他在程序员圈子里面的影响力吧,以此收揽人才?
rashawn
2017-02-27 23:11:19 +08:00
楼主你拿 Google 搜中文干嘛

这种文章,搜英文的完全没有废话,基本想找的东西很快就能找到,而且比中文的要新一些。

你竟然看一篇旧的文章还看这么仔细,好闲……
xuboying
2017-02-27 23:11:53 +08:00
楼主你给他留言他会修改的,不要在这里揭短,承认你 unicode 这块熟练,但你未必有人家有耐心有时间持续的写程序博客。
xianlin
2017-02-27 23:19:18 +08:00
软一封确实不是程序员出身,但是他也是为了分享知识才写的博客,写东西一定会有错误,有了错误就会改正,希望你的这些建议可以通过更直接的方式反映给作者,造福众生,普及程序大法,此乃一大幸事。否则浪费了这么长的一个帖子。
thekll
2017-02-27 23:36:00 +08:00
字符集 character sets 和字符编码 character encodings 是两个不同的概念,经常被乱用。

unicode 标准包含了统一字符集、编码方式( utf-8,uft16,ucs-2/4 等)、和字符相关的数据文件,一组与字符属性相关的条目定义等。

毕竟这是最基础的概念,各种文件的编码问题都与此有关。
lzjun
2017-02-27 23:45:55 +08:00
@xuboying 不是揭短,更没有比他熟悉。我也是为了弄懂字符编码查阅了很多资料,才发现他写的有些地方不严谨。才逐一指出,请理性看待这问题。我写这个也纯粹是希望遇到类似问题的人不要受误导,如果你不是目标用户完全可以忽略
williamx
2017-02-27 23:46:01 +08:00
Unicode 这块是比较难介绍的,因为现实中,这块已经是比较混乱了——当然,计算机相关行业的名词一向都是比较混乱的。

在我的理解, Unicode 是一个标准, UTF-8 等是这个标准的实现,这个很简单,很清晰。

然后在某些不那么严格的环境下,不需要明确指出到底是哪一种编码的情况下,大家用 “ Unicode 编码”这个说法来 表示实现。这其实也是很好理解的,没有错误。

可是第一个混乱 出现了,“ Unicode ” 这个单词在实际使用中没有被单纯的认为是一个标准的名字,它还被用于其他的地方,比如阮文中的“ Unicode 只是一个符号集”,比如其他文章中出现的“ Unicode 就是上文中提到的编码字符集”,还有其他很多的说法,直接让人搞不清楚 Unicode 到底是什么,连原本没有问题的“ Unicode 编码”这个说法也 模糊起来了。

其次,某些软件商出于各种目的,比如没完全理解这些概念,比如为了对普通用户更友好,比如照抄其他软件的设定等等原因,又在他们的软件中用了“ Unicode 编码”这个东西。悲哀的是很快他们就发现了“ Unicode 编码”这个说法的局限性,不得不又引进了更具体的 UTF-8 , UTF-16 这样的设置,好像 “ Unicode 编码”和 UTF-8 是平级的,于是这就更乱了。

于此同时,某些软件又把字符编码和文件格式搞在了一起,在文件的开头加了两个字节,当然它们也有苦衷,但是这尼玛直接导致其他一些软件硬生生在文本的开头多了两个不可见字符。

再加上另一个组织的 UCS 标准,再加上后来 UCS 和 Unicode 又合并了,直接导致了不学历史的人是搞不懂这些概念的。

至于阮的这篇文章,我同意你的看法, 严格来说,确实有很多的错误——当然,严格来说,我上面写的这些也是有很多错误的——这毕竟不是论文,并不需要每个表述都去查证。
lzjun
2017-02-27 23:48:59 +08:00
@williamx 赞同你的说法。
quericy
2017-02-27 23:58:44 +08:00
人非完人,是否会有错误和是否有名气无关。
而且个人博客有错误在所难免,评论区的意义不也就是对问题的探讨么?

UTF-8 的问题之前也踩过坑,但是不懂的话一般都会谷歌多篇资料来看吧

随便搜到一个答案就当作正解的话早就被那些刷 SEO 的垃圾采集站给坑死了
博客里的东西至少提出问题都可以对内容做出探讨和修正,比那些搬运转载的资料靠谱的多
cxbig
2017-02-28 00:04:33 +08:00
挑别人的毛病很容易,问题是 10 年前的文章抓着不放有点没劲了。
每个人都在成长,很多对事物的理解是不断变化的。

同上面一些人说的,如果文章依然在,倒不如直接去留言讨论。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343634

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX