
不同网页选择不同编码形式
我们将字符的集合成为字符集(char set),为了让计算机能存储、传输并显示字符,需要给字符集以编码。
由于历史的原因字符集的编码形式有多种。
如:ASCII码只能表示一些英文字符(7bit);GBK/GB2312用两个字节表示中文;UTF-16用2个或者4个字节表示一个字符;UTF-8用变长形式表示unicode,兼容ASCII,英文只需要1个字节表示,而中文则需用三个字节表示。
不同的网站可能会使用不同的编码字符集,如UTF-8虽然完美兼容ASCII,而且俨然是网页编码的主流选择,但是每个中文字符字节数是GBK/GB2312的1.5倍,网站传输过程中的流量也就是1.5倍,所以一些中文网站还是选用GBK/GB2312字符集。
怎么获取网页字符集
web server response header
对网页而言,第一种方法是web server在HTML page之前返回一个类似于Content-Type: text/html; charset=utf-8
的http header,这个header作为response header返回而不是网页的一部分。
但是如果网站由很多网页组成,而且不同的网页由使用不同的语言的用户贡献上传,那么web server不知道每个文件的真实编码集。
Content-Type of HTML
第二种方法是在HTML文件中直接写入Content-Type来指定charset。
这里有个鸡生蛋蛋生鸡
的问题,你怎么能在不知道HTML文件编码方式的情况下来读取文件呢?
幸运的是,基本上几乎所有的字符集从32到127的字符都是一样的,也就是兼容ASCII码。所以我们可以用ASCII来写HTML页面的tag来指定charset:
1 | <html> |
我们必须将这段
tag放在HTML最开始的地方,因为只要浏览器读取到这个tag,会停止分析网页并用指定的编码集重新解析整个网页。web brower guessing
如果浏览器没有找到Content-Type
怎么办?
浏览器会基于不同语言常用字符集的高词频编码来猜测字符集。
当然猜测就会有猜错的几率,如果猜错了,我们可以手动改变浏览器的编码(如Chrome,在更多工具
->编码
里可以修改编码)。
Python获取网页编码
用三种不同的方法获取网页编码。
1 | #encoding=utf-8 |
运行结果:
1 | system charset: mbcs |
可以看到结果有些站点的response是空值。
大部分网站采用的UTF-8编码,一些网站如qq、sohu、163、jd用的是GBK/GB2312,而日本乐天网站用的是EUC-JP编码。
网页字符集统计
通过Historical yearly trends in the usage of character encodings for websites这个网页可以看到UTF-8是网页编码无可争议的绝对主导地位。
在2016年1月23号,我们看到排在前列的编码字符集是:UTF-8(86.2%) ISO-8859-1(6.8%) Windows-1251(1.9%) Shift JIS(1.1%) Windows-1252(1.0%) GB2312(0.9%)…

Reference: