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

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

17750 次点击
所在节点    程序员
115 条回复
onsala
2017-02-27 21:12:12 +08:00
Linux 系列的科普文章也是
watzds
2017-02-27 21:15:00 +08:00
有错误不是很正常吗,看谁的文章都要自己判断
你打算给他的所有文章做勘误?
FrankFang128
2017-02-27 21:15:21 +08:00
错误挺多的,不影响我看他的文章。
他原本就不是程序员啊。
peneazy
2017-02-27 21:16:28 +08:00
有错误不是很正常,我自己的技术博客都很多错误
onlyhot
2017-02-27 21:21:03 +08:00
@watzds 很多人没有这个判断的水平。换句话说,如果懂这个,我还看这篇文章干什么?就是不懂才看,既然不懂,就别谈自己判断了。
Kokororin
2017-02-27 21:26:18 +08:00
摘下眼镜,模糊的看最好
notes
2017-02-27 21:27:54 +08:00
HLT
2017-02-27 21:33:15 +08:00
他没有工程经验
i8d0g
2017-02-27 21:41:49 +08:00
哈哈 你说这篇文章我就乐...
我当时被乱码问题折磨,然后想把这问题搞清楚,网上看了些文章,有了些概念,结果一不小心看了他这个“ Unicode 与 UTF-8 之间的转换” 被绕进去了...
21grams
2017-02-27 21:46:18 +08:00
吹毛求疵,谁的文章没有错?
gouchaoer
2017-02-27 21:50:10 +08:00
git 不安装 gui
SuperMild
2017-02-27 22:05:07 +08:00
他的博客开放评论,可自由发言指出错误,想深入了解的人自然会看评论。
crab
2017-02-27 22:09:45 +08:00
FE FF 大端
FF FE 小端
这边描述哪里错呢?
lzjun
2017-02-27 22:16:34 +08:00
@crab FEFF 作为零宽度非换行空格仅仅是它出现在字节序列的中间时的作用,用户看起来就是一个空格,不过从 Unicode3.2 开始就只能规定 FEFF 只能出现在字节流的开头,只用于标记字节序(大小端)。这是来自维基百科的说法
lzjun
2017-02-27 22:17:57 +08:00
@SuperMild 哈,看评论很多都是盲崇,真正较真指出错误的很少
lzjun
2017-02-27 22:20:53 +08:00
@21grams 并不是说他的文章有错就想怎么地,我们讨论的是文章哪些地方有错, 拿出来讨论,仅此而已。
vultr
2017-02-27 22:22:12 +08:00
与其花大量的时间去找错误,还不如自己写几篇正确的来得有意义。
keisuu
2017-02-27 22:24:33 +08:00
@peneazy 他的文章有错误,容易误导一大批人,他的影响力还不小。不管看谁写的文章,关键还是要有独立思考的能力
qingshi
2017-02-27 22:26:32 +08:00
@FrankFang128 啊,阮一峰不是在阿里做程序员吗?
phrack
2017-02-27 22:37:01 +08:00
有错误正常,特别是涉及到编码的文章。

讲解编码的文章我只怕看了不下十篇,很多是越看越迷糊,有一篇讲的非常好可惜一时没找到。

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

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

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

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

© 2021 V2EX