HTML文档的字符集和编码

HTML文档的字符集和编码_第1张图片
1895-lake

这是一个老问题-乱码(mojibake)!由于页面的编码问题,经常遇到页面显示乱码的问题,借这个机会理清字符集编码的关系。这里并不对各种字符集和编码的具体实现进行讨论,只是弄清楚他们分别是什么,有什么关系,怎么用。字符集和编码问题并不只在HTML中存在,在XML、Json、CSS、程序源码及文本文件中都会遇到。由于理解比较粗浅,错误的地方欢迎指出。

怎么用

这里先介绍HTML里面怎么指定编码。

随便打开一个网站,都能在head里面看到以下类似代码:

  
  
 

浏览器在获取HTML文档后,会根据这段代码指定的编码方式(charset=utf-8)对HTMl文档进行解码,如果HTML文档本身的编码方式和指定的编码方式一致,浏览器将正常的解码并显示字符,如果HTML文档本身的编码方式和指定的编码方式不一致,就会出现乱码。这里HTML本身的编码方式指在保存HTML文档时指定的编码方式,如通过记事本默认保存的编码为ANSI,如果在中国,则就是用的gb2312编码,因此如果charset指定的是utf-8,也会出现乱码。

  • charset=utf-8中的charset并不是字符集的意思,而是指编码
  • 国内最常用的编码方式为utf-8gb2312

再次强调:HTML文档本身的编码要和HTML中指定的编码一致

是什么

平时遇到乱码问题基本都归类为编码问题,实际其中包含了两层意思,从charset的命名也能看出端倪,字符集编码

字符集

字符集意思是一类字符的集合,也可以叫字符库,本身并不是编码的概念,如ASCIIUnicode,但是很多字符集本身也代表了一种编码,如gb2312gbk等,因此有时也把这些字符集叫做编码,没毛病。

编码

编码是我们平时直接使用的,而字符集我们并不直接使用。

计算机并不认识这些字符集,他们只认识0和1,因此通过0和1的组合唯一的标示这些字符的规则就是编码,如Unicode对应的编码有utf-8utf-16utf-32,每种编码都有自己的规则,有些兼容有些不兼容。

这里简单介绍一下Windows记事本中的编码:

  • ANSI指通过多个字节对ASCII进行扩展的、跟本地相关的编码方式的统称,在大陆就是gb2312,在台湾就是big5,在日本就是Shift_JIS
  • Unicode编码实际使用的是utf-16+BOM编码;

Windows提供了ANSIUnicode的转换,可以通过代码页,实际就是一个映射表,不具体介绍。

字符集和编码的关系

上面已经说明了他们之间的关系,这里简单列举一下常用的字符集和编码:

字符集 编码 长度
ASCII ASCII 单字节
Unicode utf-8、utf-16、utf-32 单字节、多字节
gb2312 gb2312 双字节
big5 big5 双字节
ISO-8859-1 ISO-8859-1 单字节
ISO-8859-* ISO-8859-* 单字节

参考文档

  • http://www.cnblogs.com/salted-fish/p/5117590.html
  • http://os.51cto.com/art/201503/467929.htm

你可能感兴趣的:(HTML文档的字符集和编码)