昨晚帮同组一个新入行的intern解决了一个中文乱码的问题,想想这个中国程序员几乎无法回避的问题,曾经引得多少程序员竞折腰!很多新人被搞的晕晕乎乎很大一部分原因是因为网上关于这个问题的“歪门邪道”的解法太多,各种场景,各种解法,有人蒙对了,问题解决了,happy ending!有人运气不好没碰上,只能抓狂了。。。
其实这个问题的根本原因不难,谁都都知道问题的关键就一点:编码字符集和解码的字符集不一致!
可是具体要找到怎么造成的不一致,这个过程往往没那么简单,你要熟悉你的字符在整个传输过程中,在哪些地方被编码了,又在哪些地方被解码了。在复杂一点的场景中,这些地方可能不止一处,甚至还会在中间参杂加解密的过程。。。
好了,上面扯了一点背景,下面会给出基于web应用的B/S架构的一些常见场景问题讨论,希望对不是很清楚整个编码过程原理的同学有所帮助。
关于字符集(CharSet)和字符编码(CharEncoding)
这个问题其实是很多人从一开始就忽略的两个概念。但是确实是字符编码最核心的两个东西。
这两个概念通常可以在网上搜到比较官方的解释,这里我只给出我个人更口语化的描述,应该更好懂一点。
字符集:是用来定义你想要表示的字符和你的对应码表的映射关系的。听起来还是有点抽象。这里拆开有几个点:首先,这里涵盖了你要表示的字符的集合;然后,这里你必须有一套码表;最后,你得定义你的码表中每一个码字是怎么和字符集合中一个特定的字符关联的。如果你对数学很敏感,那么这个字符集可以归结为一个逻辑上一元函数:y = f(x) ,当然,这个函数并不是连续的。
字符编码:用来规定上面提到那套码表中的每个码字到底怎么在计算机存储中或者网络传输中表示为字节(或者字节组合)的。
OK,如果你了解了上面提到的两个概念,我们来看看日常生活中经常接触的那些个词都是神马东西。
- ASCII:美国佬在最初创建计算机字符时,谁也没鸟,只想着英语那几个字母,加上常用的一些公式字符啊神马的,就哦了。于是他们最初很狭隘的值定义了一套只有128个元素的码表,这套码表也就顶多映射128个字符了。如果你是个程序员,那么你应该很清楚,128个元素可以轻松用一个字节搞定。于是美国佬也是这么干的,直接用一个字节搞定了ASCII。他们玩的很happy!
- ISO-8859系列:计算机传入了世界各地,传入了民用领域。大家为美国人只考虑自己的行为非常不满意,在口诛笔伐的同时,纷纷发奋图强,自力更生,一时间全球范围内出现了各个地区的造字造码运动(这其中当然包括我天朝,事实上,今天你很熟悉的GB系列的双字节编码也是那个动荡年代产生地)。尼玛,这还了得,这严重影响了全球人民的交流啊。得有全球统一的标准啊。于是身为标准组织的ISO大哥站出来,一声巨吼:“都给我消停儿地!”。于是这位哥哥不辞辛苦的搞出了ISO-8859-1~ISO-8859-15一个系列字符集。不过这个系列中,到今天还最为广大程序员熟知还是他们家族的老大ISO-8859-1。为什么呢?因为他完全和后面提到的Unicode的前256个字符码表定义重合吗?那你天真了,因为这货往往是你遇到乱码问题的罪魁祸首(作为完全兼容ASCII字符集的西欧字符集,这货基本cover第一世界国家,也是作为绝大部分的Linux/Unix发行版本的默认字符集)。注意,到此时,我们所接触的字符集都是可以用单字节搞定的。
- GB系列:这个系列中,我相信你最熟悉肯定是GBK和GB2312。事实上,GB2312才是我天朝第一个正统皇家血统的字符集。我大中华文字博大精深,岂能就用一个字节敷衍了事,必须两个字节!(其实,当我们考虑字节数量的时候,已经在不知不觉的考虑字符编码的问题了。)不过遗憾的是在GB2312的制定过程中,真正涵盖的中文汉字也没超过7000个。对于符号的涵盖也有遗漏。于是乎,GBK作为一个商业上的事实标准,闪亮登场了。他在前者的基础上扩充了若干字符,形成了更为全面的汉字库(简繁均被纳入麾下),并且做到了对GB2312的全兼容。
- Unicode:这货应该整天在你耳边萦绕,而绝大部分人除了知道他号称涵盖了当今世界上所有字符之外,却未必真正了解他。他是专门的一个Unicode的一个组织创建和维护的(是的,你没有看错,他出身跟ISO没有半毛钱关系!)。话说ISO也不是吃闲饭的,当然也意识到了全球大一统的重要性。所以几乎在同时期,ISO也有和Unicode非常同志的字符集UCS-2和UCS-4(简单粗暴的区分的话,可以认为2表示需要两个字节,4需要4个字节范围来涵盖对应的码表;虽然事实上并非如此简单)。我相信这两个字符集对于绝大部分人都是陌生的。不过很快两个组织就认识到了两种标准将给未来带来的麻烦,所以今天事实上的Unicode字符集基本上和UCS-2是完全兼容的。说到这里,你终于接触了一个纯字符集。Unicode本身其实并没有任何具体存储的实现细节规定。
- UTF系列:这个系列“基本”可以认为是针对Unicode不同字符编码实现了。这个家族中你最常看见的基本上就是UTF-8/16/32这几个了。UTF-16作为最简单粗暴的Unicode实现,直接使用两个字节对Unicode的码表进行映射。这种实现看似简单,但在真正传输或者存储的过程中,其实还有个问题得明确,就是这两个字节谁前谁后?这个问题涉及到所谓Big-Endian或者Little-Endian的选择上,通常这个和乱码问题不会扯上直接的关系,所以这里暂时略过。对于UTF-32更准确的说是对应上面提到的UCS-4的字符编码实现,所以平时基本接触不到。UTF-8才是真正意义上的Web常用字符编码之一,而且也是因为他的特殊变长(他实际上的变长范围是1~6个字节,网上绝大部分的中文资料只写了是1~4个字节)规则,导致他其实不需要前面提到Big-Endian还是Little-Endian的问题。
擦,发现扯了一大通,居然还为进入乱码主题,太标题党了。
想把这个说清楚也着实不易啊,今天先到这里吧,只能先把标题加个(一)了。
未完待续。。。
相关推荐
在 Java 开发中,如果框架搭建的不完善或者初学者在学习过程中,出现中文乱码是经常的事儿。那么,为什么会出现中文乱码呢?原因是 Http 请求传输时将 URL 以 ISO-8859-1 编码,服务器收到字节流后默认会以 ISO-8859...
最近遇到个恶心的事儿,就使用死丢丢的时候,发现怎么我的控制台输出中文都显示方框???别人都没事,恶心坏我了。经过各种百度,终于找到解决办法,办法也是够恶心的。我们一起来看看吧。 乱码显示结果如下: ...
该文件《一年级阅读带拼音成语故事.pdf》的内容虽然因为OCR扫描技术原因出现了错别字和乱码,但仍然可以识别出其旨在为一年级学生提供带有拼音的成语故事。这种阅读材料对初学汉语的学生来说非常重要,它不仅有助于...
这个工具对于那些需要处理中文文本,例如进行搜索引擎优化(SEO)或者构建多语言网站的开发者来说非常有用。 描述中提到"php工程师必备的组建,里面有实例,方便易用",这暗示了该资源可能包含一个易于理解和集成的...
至于具体内容部分,它包含了一系列的字符、数字、字母以及一些看似被打乱的汉字和题目选项。这些内容很可能是扫描文本的OCR结果,可能夹杂着识别错误和乱码。 由于这些内容主要是试题和答案,而非系统性的知识点,...
很抱歉,您提供的文件内容信息不包含有效的文本内容,而是一串看似乱码的字符,这使得无法直接从给定信息中生成相应的知识点。考虑到您提供的标题和描述信息,可以推测此文件可能是一份一年级下册语文园地的教案,...
由于提供的【部分内容】是一系列符号和乱码的字符串,显然是OCR扫描技术未能正确识别出文字内容的结果。这种情况下无法提取出具体的教育知识点。但是,我们可以从给定的信息中提取出“小学语文部编版一年级(下册)...
由于提供的文件内容实际上是乱码,无法解读出具体的教育内容和知识点。但是,我们可以从文件的标题和描述中推测出这是一份针对一年级学生在2017-2018年第一学期结束时的语文期末考试试卷。尽管没有具体内容的详细...
该课文可能是一篇儿童文学作品,通过寓言故事的形式,来介绍某种知识点,或者是寓教于乐的科普材料。 通常,一年级下册的语文练习可能会包含以下几个方面的知识点: 1. 字词学习:一年级学生需要认识和书写基础...
抱歉,根据提供的文件信息,内容部分包含的是一系列数字和字母的组合,以及不连贯的文字片段,这些内容看起来并不像是有关“一年级语文上册期中考试”的有效信息,更像是OCR扫描错误或文本损坏导致的乱码。...
2. 语文科目的教学:文件名中的“语文”二字,说明这是一份针对小学一年级语文科目的测试卷,语文作为中国学校教育的基础科目之一,涉及汉字书写、阅读理解、语言表达等方面。 3. 测试卷的性质:提到“期末测试卷”...
由于文件内容部分的文字是通过OCR扫描技术产生的,并且文件内容出现了大量无法识别的乱码,无法从中提取具体的语文练习题目或知识点。这种情况下,无法直接分析具体的语文知识点,如字词学习、阅读理解、句式运用等...
根据提供的文件信息,可以看出这是一个关于一年级上册语文期中考试的文档,文件标题和描述中提及的内容是相同的。文件标签为空,无法提供额外的信息。而文件的内容部分由于OCR扫描技术的限制,出现了字符识别错误和...
由于提供的文件内容似乎是经OCR扫描处理的文档片段,并且内容不连贯,大部分信息是乱码或不完整的文字序列,因此难以直接从中提取出有关一年级语文上册期中考试的题目和答案。尽管如此,我还是可以根据文件的标题和...
很抱歉,给定文件的内容片段无法提供具体信息,因为它似乎是随机字符,可能是OCR扫描错误导致的乱码,没有实际的教学案例和教学反思的内容。为了遵守规则,我将不涉及这段乱码内容,而是根据标题和描述中提供的信息...
"判胜负/弃权一手"是围棋游戏中常见的术语,这里提到的“能正常显示”,意味着在更新后,这些关键功能的中文显示已经完善,不会出现乱码或者翻译不准确的问题,确保了游戏的流畅体验。 简体中文化的进程通常涉及到...
2. "ͼƬ2.JPG" 这可能是背景图片的文件名,虽然显示为乱码,但在解压后应该会显示正确的中文名称,即“天空下的雪地PPT背景图片”。 3. "第一PPT.url" 这也是一个快捷方式或链接文件,同样指向第一PPT模板网,方便...
从给出的文件信息中,我无法获取到具体的教学设计内容和教育理念,因为文件中仅包含了数字和一些乱码,而不是实际的教学设计文本。 然而,基于标题“一年级上语文教学设计太阳的话_鄂教版.pdf”,我们可以推测一些...
《汉之云繁体转简体补丁》是一款专为《轩辕剑五外传:汉之云》游戏设计的辅助工具,旨在帮助玩家解决游戏中文字显示的问题,将原本的繁体中文转换为简体中文,使得对繁体字不熟悉或者阅读困难的玩家能够更好地理解和...
例如,如果你有多个独立的短篇故事想合成一本电子书,这个工具可以快速完成任务,而无需手动复制粘贴。 描述中提到“不会出现乱码”,这意味着该工具在处理非ASCII字符(如中文、日文、韩文等)时,能保持文本的...