这是一个老问题-乱码(mojibake)!由于页面的编码问题,经常遇到页面显示乱码的问题,借这个机会理清字符集和编码的关系。这里并不对各种字符集和编码的具体实现进行讨论,只是弄清楚他们分别是什么,有什么关系,怎么用。字符集和编码问题并不只在HTML中存在,在XML、Json、CSS、程序源码及文本文件中都会遇到。由于理解比较粗浅,错误的地方欢迎指出。
怎么用
这里先介绍HTML里面怎么指定编码。
随便打开一个网站,都能在head
里面看到以下类似代码:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
浏览器在获取HTML文档后,会根据这段代码指定的编码方式(charset=utf-8
)对HTMl文档进行解码,如果HTML文档本身的编码方式和指定的编码方式一致,浏览器将正常的解码并显示字符,如果HTML文档本身的编码方式和指定的编码方式不一致,就会出现乱码。这里HTML本身的编码方式指在保存HTML文档时指定的编码方式,如通过记事本默认保存的编码为ANSI
,如果在中国,则就是用的gb2312
编码,因此如果charset
指定的是utf-8
,也会出现乱码。
charset=utf-8
中的charset
并不是字符集的意思,而是指编码- 国内最常用的编码方式为
utf-8
和gb2312
再次强调:HTML文档本身的编码要和HTML中指定的编码一致。
是什么
平时遇到乱码问题基本都归类为编码问题,实际其中包含了两层意思,从charset
的命名也能看出端倪,字符集和编码。
字符集
字符集意思是一类字符的集合,也可以叫字符库,本身并不是编码的概念,如ASCII
和Unicode
,但是很多字符集本身也代表了一种编码,如gb2312
、gbk
等,因此有时也把这些字符集叫做编码,没毛病。
编码
编码是我们平时直接使用的,而字符集我们并不直接使用。
计算机并不认识这些字符集,他们只认识0和1,因此通过0和1的组合唯一的标示这些字符的规则就是编码,如Unicode
对应的编码有utf-8
、utf-16
和utf-32
,每种编码都有自己的规则,有些兼容有些不兼容。
这里简单介绍一下Windows记事本中的编码:
-
ANSI
指通过多个字节对ASCII
进行扩展的、跟本地相关的编码方式的统称,在大陆就是gb2312
,在台湾就是big5
,在日本就是Shift_JIS
; -
Unicode
编码实际使用的是utf-16+BOM
编码;
Windows提供了ANSI
和Unicode
的转换,可以通过代码页,实际就是一个映射表,不具体介绍。
字符集和编码的关系
上面已经说明了他们之间的关系,这里简单列举一下常用的字符集和编码:
字符集 | 编码 | 长度 |
---|---|---|
ASCII | ASCII | 单字节 |
Unicode | utf-8、utf-16、utf-32 | 单字节、多字节 |
gb2312 | gb2312 | 双字节 |
big5 | big5 | 双字节 |
ISO-8859-1 | ISO-8859-1 | 单字节 |
ISO-8859-* | ISO-8859-* | 单字节 |
网友评论