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

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

18250 次点击
所在节点    程序员
115 条回复
dtfm
2017-02-28 00:18:09 +08:00
@mimzy 我是看 pymysql 的 Gihub Readme 学到的 ,当时奇怪为什么作者要设定 charset =utf8md4 这个奇怪的东西
intret
2017-02-28 00:32:17 +08:00
@laoyuan 哈哈,原来你说的是我
ltux
2017-02-28 00:36:52 +08:00
看这种二手知识时带有自己的思考是对的,本来别人文章里有不足之处,指出即可,别整天叫板这个叫板那个,这有什么好叫板的呢?我个人很不喜欢这种标题。

第一个问题:
楼主说“ Unicode 并不是一种什么编码格式,仅仅是字符集而已。 Unicode 字符要存储要传输怎么办,它不管,可以用 UTF-8 、 UTF-16 。”
那么我们看看 unicode 自己是怎么说的: http://www.unicode.org/standard/principles.html
The Unicode Standard is the universal character encoding standard used for representation of text for computer processing.
Character encoding standards define not only the identity of each character and its numeric value, or code point, but also how this value is represented in bits.
The Unicode Standard and ISO/IEC 10646 support three encoding forms (UTF-8, UTF-16, UTF-32) that use a common repertoire of characters.
翻译: The Unicode Standard 是一种 universal character <加粗>encoding</加粗> standard. Character encoding standards 不止定义每个 character 的 code point ,也定义这个值如何用比特表示。
The Unicode Standard 支持三种 <加粗>encoding</加粗> forms ,即 UTF-8, UTF-16, UTF-32

看见这里是怎么使用 encoding 这个词的么?这里一点儿都不装逼也不纠结,该用 encoding 就用 encoding ,该解释 code point 就解释 code point, 一点不矛盾。另外, unicode 说自己不止定义字符的代码点,也定义该代码点的值如何用比特表示,根本不像楼主所说的什么“ Unicode 仅仅是字符集而已”。



第二个问题:
阮一峰说的是“如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0 ”,注意说的是如果,如果,如果,重要的事情说三遍。楼主不要上来就想搞个大新闻,说什么“ Unicode 并没有统一规定每个符号用三个或者四个字节表示”, unicode 当然没有这么规定,阮一峰也没说 unicode 这么规定了,阮一峰说的是如果,如果,如果,是为了引出下文的 utf-8 、 utf-16 、 utf-32
intret
2017-02-28 00:38:27 +08:00
上次为了自己解析 UTF-8 数据流中的 Emoji (什么人种皮肤颜色+表情合成)上 http://www.unicode.org 看,几天几夜地看,头晕眼花。
qq286735628
2017-02-28 00:48:58 +08:00
有错直接原文评论指正,相信他会接受的。

写东西主要还是写给自己看,用自己的语言陈述一遍加深印象, Google 排名高误导人这不能怪他。

写博客风格很多种,严谨仅仅是其中一种形式,正如此文你让我知道了他文章不正确的内容。

但这种背后捅刀子,以后谁还写敢博客谁还敢分享?(看了 lz 前面的评论,原来 lz 没这个意思,但原文和标题火药味还是蛮重的)

说到这顺便感慨一下,最近面试了很多童靴,讲很多知识点都讲得头头是道,但是我再问一句“这是真的吗?你验证过没有?”就都哑巴了,都不去实践验证一下,看到别人写什么就信什么。 lz 这种深究的精神赞一个。
seeker
2017-02-28 02:12:43 +08:00
以前看看自己不懂的还以为是对的,结果后来看到一个我懂的,发现他就是以其昏昏使人昭昭.. 于是再也不敢看了,怕记个错误的东西,也怕耽误时间理解错误的东东。
stabc
2017-02-28 02:30:36 +08:00
看正文挺赞的,看评论吓一跳。
congeec
2017-02-28 06:14:21 +08:00
@stabc 嗯啊,楼主正文就事论事,并没有针对阮一峰。但是只看标题就感觉楼主在跟人撕逼。看楼上评论我觉得好多人根本就没读文章
des
2017-02-28 07:02:43 +08:00
@lzjun 你觉得这个错误可能会误导大家,所以为什么不联系作者去改呢?人还是要谦虚的好。
DeutschXP
2017-02-28 07:46:06 +08:00
@lzjun 可能我说的很不客气,但我能看到的事实,只能让我做如此推断:一个新人,试图想要踩在别人肩膀上面往上爬。大家都是明白人, IT 圈不是娱乐圈,吃相请不要那么难看。
如果你想反驳,那么很简单,请拿出你在 2017 年 2 月 27 日之前和阮一峰的沟通证据,无论是邮件还是其他方式,请让我们看到,你所做的一切,真的出自学术的目的,是想勘误,想讨论,而不是想炒作。
songofhawk
2017-02-28 07:46:16 +08:00
我以为楼主的文章很好,内容也是客观诚恳的,给了大家一个讨论问题,澄清概念的机会。

人家也未必没有给阮一峰老师留言啊,揣测动机来否定不好。
zollero
2017-02-28 07:53:09 +08:00
没有绝对的正确,只要 90%以上正确,能从中得到启发便足矣。
murmur
2017-02-28 07:58:22 +08:00
最近一篇的错误不是狂吹 golang 么 还有 gos 一统江山
ersic
2017-02-28 08:17:35 +08:00
如果楼主的标题是「阮一峰的这篇文章有哪些错误」,然后内容贴出这篇文章是没有任何问题的。但是你的标题,再加上主题的第一句「比如」,怪不得别人怀疑你的动机了。
lovedebug
2017-02-28 08:18:55 +08:00
中文世界愿意和热爱分享的本来就不多
berretta
2017-02-28 08:23:16 +08:00
阮一峰:编码之我见 楼主:阮一峰之编码之我见之我见 v2er :楼主之阮一峰之编码之我见之我见之我见
ersic
2017-02-28 08:46:29 +08:00
忍不住再多说一句,年前有人和阮撕过一次,是非曲直暂且不论,下面这段话我是非常认同的,也符合回应楼主的质疑。
http://ww1.sinaimg.cn/large/8c907d89gy1fd5w6m72b4j20gh0a8dhg
cszhiyue
2017-02-28 08:48:25 +08:00
不要歪楼,楼主关注点是用这个例子问出还有哪些是有错误的,我觉得挺好的。做个勘误
ersic
2017-02-28 09:11:34 +08:00
@stabc
@congeec
@songofhawk
@cszhiyue
我不觉得这种文章本不是很长说话说一半,最后甩个公众号文章,标题还是「叫板阮一峰老师」的行为只是为了勘误。
liuxu
2017-02-28 09:16:10 +08:00
就第一句话,第一个“编码”是名词,第二个“编码”是谓词,第三个”编码“是名词,中文博大精深,这也是没办法的事。。

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

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

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

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

© 2021 V2EX