标签归档:浏览器

浏览器基础知识

WebKit所包含的WebCore排版引擎和JSCore引擎来自于KDE的KHTML和KJS。Apple的Safari是基于WebKit(AppleWebKit)引擎的浏览器 。(Webkit实际由Apple控制)。

WebKit所包含的WebCore排版引擎和JSCore引擎,均是从KDE的KHTML及KJS引擎衍生而来。它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。

——————–
上面说的WebCore(KHTML)和JSCore(KJS)是一个浏览器核心的两个组成部分,一个是页面渲染,一个JS解析器。苹果把KHTML换了个名字叫WebCore,一个意思,跟Firefox浏览器中用的Gecko是同样概念的东西,都实现页面渲染。

Google在发展自己的浏览器时并不是从头开始的,它从WebKit基础上创建了一个叫Chromium的内核,Google自身维护这个内核,Chrom就基于这个内核,但是Google从2010年开始开始决定“脱离”WebKit,真正自己维护一条主线,所以这个内核改名为blink引擎。(Blink是一个渲染引擎,从WebKit分离)。

Google的Chromium是一个开源浏览器实现,包括了Blink引擎和V8引擎。Chrome是基于Chromium的,不一样的地方是:Chrome是闭源的,并且添加了自己的特色功能。

其它的浏览器厂商可以基于Chromium或WebKit开发自己的浏览器,并在其上贴牌、增加特色功能等,跟Apple的Safari和Google的Chrome是同一个级别的。

所以浏览器可以简单分为几大类:
1 基于Webkit,比如Safari
2 基于Chromium, 比如Chrome
3 Firefox(Gecko)
4 IE类

简单的关系图:
browser-relate

国产多核浏览器

360有两款浏览器,一个声称安全,一个声称快速(极速)。莫非想骗两批小白吗?

这两个浏览器都是双内核的,第一个疑问是:除了我告诉你用哪个内核,你怎么判断一个网页应该使用哪个内核类渲染? 在帮助中找到这段话:
“优先通过Webkit内核渲染主流的网站,只有小量的网站通过IE内核渲染,以保证页面兼容。在过去很长一段时间里,主要的控制手段是一个几百k大小网址库,一个通过长期人工运营收集的网址库。”

言外之意就是,为那些老古董网站专门拿一个老古董伺候。这样看起来,国内使用IE的人数应该没有那么高。目前冲刺着各种xx浏览器,大体跟这些个360xxx浏览器差不多。

首先看看360的极速浏览器,内核切换:
ua

这里有三个方式,极速 兼容 IE9,IE9跟当前系统安装的IE9一样(如果安装的是IE8,这里就是IE8),然后分别输出UA字符串看看:
极速:
ua_string

兼容:
ua_string_ie7

IE9:
ua_string_ie9

对比发现,极速内核跟我当前使用的Chrome浏览器输出一致,IE9的输出跟我当前的输出也是一致的。访问一个老古董网站(国有4大银行网站就是),默认会切换到兼容模式,意思就是用一个IE伺候它。

接下来再看看这个360安全浏览器:
ua_sa
它只提供了极速 和 兼容,很明显,它和IE划得界限更加清楚一点。UA输出也是一样的。

看起来,这两个东西都差不多吧,安装外挂多少不同而已,多安装点,就会慢点,声称安全,少安装点,说它快。多少有点恶心,有没有?

浏览器提交数据编码测试

PHP脚本文件使用GB2312编码
Chrome浏览器能自动检测到是GBK编码,文件中的中文字符(GB2312编码)能正确显示。
1)POST提交中文字符数据,编码是EUC-CN(GB2312),GET提供中文字符串数据(?s=字符编码),检测到提交过来的数据是UTF-8编码,显示也是乱码(因为使用GBK编码解释UTF-8编码的数据)。
2)AJAX POST提交中文字符数据,编码是UTF-8;AJAX GET提供中文字符串数据,编码是EUC-CN(GB2312)

火狐浏览器测试除了AJAX GET提供中文字符串数据,编码是UTF-8外(尽管JS脚本是使用GB2312编码)其它跟chrome一致。

Safari for Windows测试跟chrome一致。

Opera测试跟chrome一致。

IE 8(win 7捆绑),在GET提供中文字符串数据(?s=字符编码),检测到提交过来的数据是EUC-CN(GB2312),这个跟firefox和chrome和Opera都不一样。其它跟chrome一致。

360安全浏览器(基于IE内核),跟chrome一样。

说明:AJAX的POST提交使用JQuery的$.post方法,在查看请求头时,发现:

Content-Type	application/x-www-form-urlencoded; charset=UTF-8

这个字符编码不确定是浏览器添加的还是JQuery添加的,如果是JQuery添加的,那么它还要负责把POST的数据转换成UTF-8编码,所以估计应该是浏览器行为。

从以上比较可以看出,POST提交的数据的编码跟form表单的编码一致,但是GET提交的数据在有中文时一般采用了UTF-8编码,但是IE浏览器视乎不遵守这个规则,高版本的IE估计会遵守规则,不过这个奇葩还是尽量少用或不用。

使用Ajax方法提交数据时,在GET提交数据上,视乎是跟脚本的编码一致的,但是firefox直接无视这个通用规则,它使用UTF-8编码。在POST提交数据上,都一致使用UTF-8编码(没有确认是否是JQuery的行为还是浏览器行为)。

当把脚本改为utf-8编码时,不管是什么方式,提交的数据带中文时都是utf-8编码的,唯独IE例外,IE中(Win 7自带版本),GET和AJAX GET提交的数据都是EUC-CN(GB2312)编码的,360浏览器(IE内核),AJAX GET也是EUC-CN(GB2312)。

最后结论是,珍惜生命,请远离IE。GET提交中文数据,服务端得到数据编码可能不一致,尽管大多数浏览器都使用UTF-8编码(低版本浏览器可能不是)。POST提交的数据时跟form表单编码一致,所以是可控的。AJAX提交数据也有差异性,所以在处理多字节字符时,最好统一使用utf-8编码。

最后附上测试程序:
GB2312编码
UTF-8编码

原创文章,转载务必保留出处。
永久链接:http://blog.ifeeline.com/1168.html