关于乱码的笔记

作者: 嘿菠萝 | 来源:发表于2016-05-04 22:31 被阅读184次

在浏览器上查看网页,偶尔会看到一些网站出现乱码的情况。关于浏览器展示乱码,这里做个简单的介绍。

认识几种编码方式
ASCII
全称美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成,每个字符占7位(1字节是8位)。
ISOLatin-1
可以认为ASCII是美国发明针对英语设计的,但欧洲人在用的时候出现了问题。对于一些特殊的拉丁字符,比如法文德文里某些字符,ASCII字符集就不包括。于是欧洲人发明了一种8位字符集是ISO 8859-1Latin 1,也简称为ISOLatin-1。它对ASCII做了个扩充,对于0-127之间的字符还使用ASCII里的字符不变, 把位于128-255之间的字符表示拉丁字母表中特殊语言字符。
UNICODE
后来计算机不断发展扩展到亚洲非洲,如何用计算机使用的二进制表示这些语言又成了问题。ISOLatin-1的8位字符集只能表示256个字符,而仅汉语就有80000以上个字符。如何把地球上绝大多数语言用一种编码方式表示出来呢? 于是发明了UNICODE编码,只用2个字节(16位)就可以编码地球上几乎所有地区的文字。但是,UNICODE只是理论上的编码方式,相当于给世界上每个文字打了个编号,但这编号具体如何在计算机里面存储,可以有多种实现方式。比如utf-8和gbk。
前面说了UNICODE只是给每个文字打了个编号,为啥不把这个编号直接转化成二进制存储在计算机里面呢? 比如英文字母s
的编号是115
, 用二进制表示是00000000 1110011
, 中文日
的编号是26085 (16进制是65e5) ,二进制是11001011 1100101
。老外才没那么傻,对于老外这种日常纯粹是用英文字符的人来说明明之前1个字节就能存储一个字母,现在为了全球大一统非要存储为2个字节,相当于一个之前一个1M的文档,现在变为2M。于是老外耍了赖,英文字母s
是115
没错,但我就用1个字节1110011
表示,而你中文日
是26085
号也没错,但是你不能在使用2个表示,而是用2个甚至6个字节表示。(为了英文的特权,牺牲其他语言的存储空间的便利),这个编码方式就是UTF-8。
UTF-8
utf-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
那GBK又是如何产生的呢?
GBK
这时候中国不干了,为啥你制定了全球大一统的规则,却为了自己的便利又破坏规则,把方便留给自己不便留给别人呢? 明明用2个字节就能表示中文一个汉字,现在UTF-8编码中文竟然需要2个甚至4个字节来表示。于是中国制定一套自己的规则,于是用2个字节来表示一个汉字,总共可以覆盖2万多个文字。 对于英文,好吧让一步,还保留和你UTF-8同样的方式使用一个字节来表示。
记住:UNICODE只是给字符一个代号,而GBK和UTF-8使用不同的规则来表示同一个代号。
网页乱码如何产生
下面这个流程是我们写入文件到展示文件的简单描述:
我们使用编辑器编写 HTML 文件
保存编写的HTML文件
使用浏览器打开HTML文件
HTML文件在浏览器展示

乱码产生的根源就在与第2步骤和第4步。
在第2步保持文件时会把我们写入的文字使用编辑器默认的编码方式进行保存。如果大家使用的是Sublime编辑器,默认的编码方式是utf-8。当然也可以安装GBK Encoding support
插件,在保存文件时可选择保存为GBK

0_1452962183066_屏幕快照 2016-01-17 上午12.35.57.png
在第4步浏览器打开网页时,它并不知道你的这个文件是使用什么编码方式,于是自作主张使用了默认解码方式。如下图所示,文件保存为GBK格式,在Chrome打开时默认使用 ISO -8859的解码方式,导致编码和解码不匹配,产生乱码。 0_1452962458223_屏幕快照 2016-01-17 上午12.38.50.png
那如何规避这个问题呢?即如何通知浏览器用什么方式解码呢?
首页,在文件保存的时候你自己要清楚是用哪种编码方式保存的(sublime默认保存方式是utf-8,如果安装了插件也可另存为gbk,其它IDE可以做设置保存格式)。如果你的文件是保存为utf-8格式,那么一定要在html 的 <head>
里添加<meta charset="utf-8">
,这句话的意思是告诉浏览器在打开这个页面的时候不要去猜了,直接用utf-8去解码。 同理,如果你的文件保存为gbk格式,一定在文件里添加<meta charset="gbk">

记住,
乱码产生的根本原因是你保存的编码格式和浏览器解析时的解码格式不匹配导致的。
乱码一般是英文以外的字符才会出现。

为啥纯粹的英文不会出现乱码问题,即使编码方式和解码方式不一致?那是因为前面讲过了 utf-8、gbk对英文都是采用1个字节的编码方式,并且使用了相同的码字。
参考
百度百科
知乎

相关文章

  • 关于乱码的笔记

    在浏览器上查看网页,偶尔会看到一些网站出现乱码的情况。关于浏览器展示乱码,这里做个简单的介绍。 认识几种编码方式A...

  • 关于乱码

    1,关于乱码产生的问题

  • python 直方图

    mac笔记本的直方图的标题中文无乱码

  • 2017年12月9日daliy

    关于 Dispatcher include方法乱码,而forward方法不乱码的情况, 原因大致是拥有控制权的se...

  • 关于springboot读取配置文件中的中文乱码

    关于springboot读取配置文件中的中文乱码

  • 关于中文乱码

    在做数据结构大作业的时候,编译打包后的jar运行起来会显示中文出现乱码最终解决方法:将资源文件(txt)多试几个编...

  • 关于乱码解决

    默认情况下插入中文会报错 但是报错的原因不在于插入的是否是中文 而是因为插入数据的时候本质上是从客户端将插入语句发...

  • 转化后台返回来的二进制流图片

    后台返回数据---图片乱码问题---上图 这篇文章主要关于如何将请求到的图片乱码转化为图片src可识别的信息,其实...

  • 关于python2.7中文乱码问题

    注意,我要说的是python的中文乱码问题,而且是python2版本的,关于python3以及其他的乱码的问题,这...

  • CSS杂谈

    关于浏览器乱码 说法正确的有 用不合适的编辑器编辑文件,常常会出现乱码,比如windows 记事本 html保存的...

网友评论

    本文标题:关于乱码的笔记

    本文链接:https://www.haomeiwen.com/subject/wefdrttx.html