首先跟大家分享一个有趣的亲身经历。有一次,在网上我看到有程序员发了一个帖子,帖子题目乍一看让人感到惊愕,但细一想又让我会心一笑。
这个帖子的题目大致上是这样的:字符编码是不是让程序员最感到恶心的问题?
更有意思的是,这个帖子下面竟然还得到了不少程序员的认同和点赞。我也表示了认同和点了赞。
为什么对字符编码会有这样的看法呢?
字符编码像个幽灵
字符编码,看起来是一个不太受到关注的边缘主题,似乎与前端技术的新潮酷炫、数据结构与算法的高大上、Java/Go/MySQL等的实用都挨不上边。
但事实上,字符编码无疑是计算机世界里最基础、最重要的一个主题之一。
然而,这么基石性的主题,在计算机教材中却只是浮光掠影般地草草带过。网络上有关字符编码的介绍文章也大多错漏百出、谬误多多。
更为令人不解的是,甚至连一本深入介绍的专门著作都找不到。对此我一直很困惑,为什么就没有哪位大牛对这个如此基础、如此重要而又如此容易让人困惑的主题写一本专著进行介绍呢?
在编程实践中,如果没有用死磕到底的精神将字符编码的来龙去脉、前世今生彻底搞清楚,只要你涉及的技术领域稍微广泛一些,那么它终将会像幽灵一样挥之不去,导致时不时地被各种与它相关的“灵异”事件折磨得死去活来。
本人正是在经受了字符编码所带来的种种令人崩溃的痛苦之后,才在痛定思痛之余,最终痛下决心,誓要将它刨根究底。
字符编码涉及面广
字符编码的基础性、重要性,主要体现在它的涉及面太过于广泛。
向下,涉及到计算机的底层技术,甚至是硬件实现。
向上,几乎跟所有的操作系统、编程语言、应用程序都密切相关。
因此,要想真正搞明白字符编码问题,必须得从计算机的基本概念——位、字节、字等等开始,再结合不同的系统环境与编程环境,进行具体分析。
类似于字符编码这样基础、重要、应用广泛而又特别容易让人困惑的基石性领域,还有字节序(即大小端表示)、正则表达式、浮点数实现、日期时间处理等等。
这些领域,都差不多具有如下共同特点:
- 非常基础,却又非常重要;
- 看起来比较偏门,却又应用极为广泛;
- 不实战的话感觉很简单,一旦实际工作中遇到了却又特别让人困惑;
- 貌似与日常工作关系不大,却又往往会在关键时刻被它们折磨得死去活来。
真正经验老到的技术负责人在招聘技术人员时,往往不会将面试重点放在对当前流行技术和热门技术的考察上,而是会放在对上述这些容易被应聘者轻视的基础技术的考察上。
道理很简单,一方面是所谓的“基础不牢、地动山摇”,基础技术的扎实与否,决定了这个人未来的技术成长空间和对新技术的快速掌握能力。
而另一方面更重要的是,通过对这些看似偏门却又非常关键的基础技术的考察,可以看出一个人的学习能力,以及对技术真正的好奇心、热情和追求。
因为新潮、酷炫、热门的流行技术几乎人人都喜欢,因此追逐流行技术是人之常情,不足为奇。
只有对基础技术仍然抱有刨根究底的好奇心和热情,才真正地体现出了一个程序员的学习能力和技术追求。
根据我多年的经验来看,这是划分平庸程序员和优秀程序员的分水岭和分界线,几乎是百发百中,极少看走眼过。
压箱底的看家本领
上面所提到基石性领域中,字节序、正则表达式跟字符编码的关系又密切相关,尤其是字节序,直接影响字符编码的字节序列。
而由于正则表达式主要用于在字符串中查找、提取字符或子字符串,要想真正理解正则表达式,也离不开对字符编码的深入理解。
因此,对字符编码的深入理解,是一个程序员基本功中压箱底的看家本领,是一个程序员搭建自身技术体系大厦的重要基石。
为此,我会尽量从日常工作中必然会遇到的各种实际问题入手,为你顺藤摸瓜、抽丝剥茧,环环相扣、层层深入,尽可能让你获得一种打通了技术的任督二脉后一气周流、酣畅淋漓的畅快感,以及彻底搞懂了技术原理后原来如此、豁然开朗的痛快感。
将涉及到的内容
下面是本《刨根究底字符编码》系列文章将会涉及到的内容:
1)关键术语解释:位、字节、字与字长、字符集、编码、解码、字符编码、现代字符编码模型;
2)字符编码的由来;
3)ASCII字符编码方案;
4)扩展ASCII字符编码方案EASCII以及ISO/IEC 8859系列字符编码方案;
5)汉字编码方案:GB2312、GBK、GB18030、GB13000、全角与半角、CJK中日韩统一表意文字;
6)汉字编码中区位码、国标码(交换码)、内码(机内码)、外码(输入码)、字形码(输出码)的区别及关系;
7)ANSI编码;
8)代码页(Code Page)、微软与ANSI代码页;
9)Unicode编码方案的面世;
10)Unicode编码方案概述;
11)字符编码模型的演变与字节序;
12)Unicode字符集的编码方式:码点、码元、UTF-8、UTF-16、UTF-32;
13)微软为什么跟联通有仇——Windows记事本的字符编码方式;
14)深入剖析奇葩的Python字符编码;
15)Vim中的字符编码问题;
16)Unicode常见问题解答;
17)总结。