浏览器占有率抽样调查
在朋友网发起的一个调查,投票时间一个月,参与人数25万多人。
结果如下图,数字公司给IE和webkit带了个套,没有自主开发内核的浏览器反而占了上风,这就是中国的浏览器市场份额的缩影,虽然不完全准确,但从样本的量来看,准确率应该是靠谱的。
辈催的前端开发们,还是要多兼容一下数字公司的浏览器啊!
在朋友网发起的一个调查,投票时间一个月,参与人数25万多人。
结果如下图,数字公司给IE和webkit带了个套,没有自主开发内核的浏览器反而占了上风,这就是中国的浏览器市场份额的缩影,虽然不完全准确,但从样本的量来看,准确率应该是靠谱的。
辈催的前端开发们,还是要多兼容一下数字公司的浏览器啊!
GB2312、UTF-8、UNICODE编码(内码或码字)在线查询:http://www.2fz1.com/so/
根据字符集的编码规则及网上下载的一个码表,使用PHP简单写了一个编码查询工具,希望对大家有帮助!
该工具能帮助编码知识学习,起到一个更好的帮助作用。
个人原创工具,服务器性能有限,请勿非法访问PHP接口,谢谢!
接上文:《谈谈字符集编码及gb2312、utf-8编码原理》
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 比如“二”字的unicode十六进制编码是:“4E8C”,对应二进制是:“100111010001100”共有15位,也就是说至少需要两个字节来存储;但对于unicode编码更大的字符,可能需要3个字节,甚至更多字节来存储。这样问题随之而来,在一段二进制流中如何区分这个字符是3个字节,还是6个字节呢?UTF-8就是unicdoe其中一个实现方式!注意只是其中一个,还有utf-16、utf-10等等…
使用1-4个字节来存储一个字符,最大的特点是可变长度。
编码规则:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
如下表所示:字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx (可填11位unicode码)
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx (可填16位unicode码)
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (可填21位unicode码)
还以“二”(100111010001100)为例,依上表可知“二”在UTF-8编码中为三个字节使用格式1110xxxx 10xxxxxx 10xxxxxx,从最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了 11100100 10111010 10001100(红色加粗为补0)即十六进制为“E4BA8C”,这个编码即为“二”的UTF-8编码。
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。 “高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
http://www.2fz1.com/so/ (本站原创工具,请勿非法访问)
比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值。 Byte是字节数,bit是位数,在计算机中每八位为一字节,也就是1Byte=8bit; Byte和bit都翻译成比特,俗称大B(Byte)和小b(bit)
从GB2312-1980编码开始,汉字都是采用双字节编码。为了与系统中基本的ASCII字符集区分开,所有汉字编码的每个字节的第一位都是1。例如:“啊”字的编码为0xB0A1。(二进制:10110000 10100001) GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
GB12345和GB13000是对GB2312-1980的扩充,所有已经包含在GB2312中的汉字编码不变,另外增加更多的码位。其编码规则大致为:第一个字节的值在0×81到0xFE之间,第二个字节的值在0×40到0xFE之间。由于GB13000是对GB2312的扩展,所以也被成为GBK。
UTF-8编码是一种目前广泛应用于网页的编码,它其实是一种Unicode编码,即致力于把全球所有语言纳入一个统一的编码。
UTF-8用来存储字符串所对应的Unicode的码点,在UTF-8中,0-127之间的码字都使用一个字节来存储,超过128的码字使用2,3甚至6个字节来存储。
所以UTF-8并不是我们所习惯认为的,一个中文两个字节,在UTF-8中,中文一般占三个字节,对于特殊字符可能占更多的字节。
关于Unicode编码的相关知识,请搜索阅读《每个程序员都绝对必须知道的关于字符集和Unicode的那点儿事(别找借口!)》这篇文章
Unicode官网:http://www.unicode.org/
PHP中unicode编码演示:
<?php
@Header('Content-Type:text/html;charset=utf-8');
$res = array('msg'=>'欢迎光临');
$res = json_encode($res);
echo $res;
?>
运行后结果:
{"msg":"\u6b22\u8fce\u5149\u4e34"}
\u代表的是unicode,后面的数字为16进制,6b22代表汉字:欢(1101011 100010)
html:
<meta http-equiv="Conent-Type" content="text/html" charset="utf-8">
PHP:
@Header('Content-Type:text/html;charset=utf-8');
前提是PHP环境要提供iconv支持。
iconv("GB2312", "UTF-8",$str);
当页面存在一个自闭合的base节点,它就会把其“下面”所有的元素都拷到它内部。
此BUG隐秘且危害性大。
解决办法:
将自闭合的标签:
<base href='http://www.2fz1.com/' />
转换为:
<base href='http://www.2fz1.com/'></base>
ul居中在oprea和firefox中用margin:0 auto;和text-align:center;就可以轻松的实现了,然而在IE中确是居左显示的,具体的错误原因就有待高手去考证。
下面的方法可以轻松的实现ul居中显示,注意ul和li都必须定义float,否则无效哦。相信大家都知道float:left
和float:right
,那么是否想过float:center
呢?让UL居中浮动!
<div id="dondiv">
<ul>
<li>列表一</li>
<li>列表二</li>
<li>列表三</li>
</ul>
</div>
我们希望实现li是浮动的,并且居中的(注:li个数不固定,ul宽度未知)。可以设置ul的text-align:center
,再设置li的display,这样的话就可以实现居中,但这样不是我们的初衷,我们需要实现的是float:center
。
大家来了解下position:relative
,它是依据left,right,top,bottom等属性在正常文档流中偏移位置。那么就可以 让 ul为position:relative;left:50%
,然后再让li向左浮动,再让position:relative
;right:50%
(或 者left:-50%
),那么li就像向中间浮动一样居中了。
#dondiv{
position:relative;
width:100%;
height:80px;
background-color:#eee;
text-align:center;
overflow:hidden;
}
#dondiv .donul {
float:left;
position:relative;
left:50%;
}
#dondiv .donul li{
position:relative;
right:50%;
float:left;
margin:10px;
padding:0 10px;
border:solid 1px #000;
line-height:60px;
}
一睹为快,Stats运行时的效果如上。这个Stats类可以帮你统计出(由上至下):
当前帧频/预期帧频
一帧运行所需时间(毫秒)
当前内存占用
历史最高内存占用
之前一直用CPU版本的,刚才找到一个可运行在Starling框架上的版本,也就是运行在GPU下的Stats类。
Starling版本:http://www.kouma.fr/files/stats.zip (出处:http://forum.starling-framework.org/topic/starling-port-of-mrdoobs-stats-class)
我们知道:和JS一样,ActionScript3.0中的Array数组可以存放多种类型,甚至在同一个Array数组中,可以同时存入String,Object,Number…,但其实我们在实际开发中,通常一个数组中所保存的元素类型都是一致的,为了改进这种情况下的效率,AS3.0新增了一个Vector类。
它强制要求数组中的每个元素都必须是同样的类型,从而提高了数组的运行效率。
//方法一
var list:Vector.<int> = new Vector.<int>();
list2.push(1, 2, 3);
//方法二
var list:Vector.<int> = Vector.<int>([1, 2, 3]);
//方法三
var list:Vector.<int> = new <int>[1, 2, 3];
相关测试表明,Vector比Array在运行效率上能快一倍左右,所以,对于同类型的数组,建议使用Vector.
在JS中,定义函数有两种方式,函数语句和函数表达式;
函数语句定义:
function testB(){
console.log("B");
}
函数表达式定义:
var testA = function(){
console.log("A");
}
1、作用域提升
在定义位置上,函数语句的方式定义,会将其作用域名提升至顶端,而函数表达式定义不会,必须先定义后执行。看下面的例子:
testB();
testA();
var testA = function(){
console.log("A");
}
function testB(){
console.log("B");
}
testA无法执行,因为找不到定义的函数,要想testA执行,必须将它的函数表达式定义放到执行时的前面。
2、this关键词的指向
在JS中,函数语句定义和函数表达式定义,this
关键词都会指向其运行时的引用,两者没有区别。
而在AS3中,函数语句定义中的this始终指向当前函数定义的域,而函数表达式定义中的this
会随着附加对象的变化而变化,且可以使用call()
和apply()
改变其this的指向。
这一点区别非常重要,特别对于js和as同时使用的前端开发来讲,掌握两者的其础知识,能避免你犯错!
在JS中,虽然没有严格的面向对象编程,但程序的设计还是有面向对象的味道。所有引用类型的数据,都是基于object;Array类型的数据,typeof时也会显示object;这给我们判断array类型,带来了不便。
细想一下array的创建过程,var arr = new Array(1,2,3);
或var arr = [1,2,3];
实际上是创建了一个Array对象的实例,也就是说实例所对应的构造函数应该是Array;根据此原理,判断方法如下:
function isArray(object){
return object && typeof object==='object' &&
Array == object.constructor;
}
注意:
该种判断方法,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;
会返回false;
原因:
1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!
即然上述方法,存在一定的缺陷,我们可根据数组的一些特性来判断其类型,代码如下:
function isArray(object){
return object && typeof object==='object' &&
typeof object.length==='number' &&
typeof object.splice==='function' &&
//判断length属性是否是可枚举的 对于数组 将得到false
!(object.propertyIsEnumerable('length'));
}
有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。