二分之一

Just Jason's Blog

浏览器占有率抽样调查

在朋友网发起的一个调查,投票时间一个月,参与人数25万多人。

结果如下图,数字公司给IE和webkit带了个套,没有自主开发内核的浏览器反而占了上风,这就是中国的浏览器市场份额的缩影,虽然不完全准确,但从样本的量来看,准确率应该是靠谱的。

辈催的前端开发们,还是要多兼容一下数字公司的浏览器啊!

Read more »

GB2312、UTF-8、UNICODE编码(内码或码字)在线查询

GB2312、UTF-8、UNICODE编码(内码或码字)在线查询:http://www.2fz1.com/so/

根据字符集的编码规则及网上下载的一个码表,使用PHP简单写了一个编码查询工具,希望对大家有帮助!

该工具能帮助编码知识学习,起到一个更好的帮助作用。

个人原创工具,服务器性能有限,请勿非法访问PHP接口,谢谢!

Read more »

谈谈字符集编码,详解utf-8、gb2312编码规则(二)

接上文:《谈谈字符集编码及gb2312、utf-8编码原理》

一、Unicode与UTF-8之间的的关系

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 比如“二”字的unicode十六进制编码是:“4E8C”,对应二进制是:“100111010001100”共有15位,也就是说至少需要两个字节来存储;但对于unicode编码更大的字符,可能需要3个字节,甚至更多字节来存储。这样问题随之而来,在一段二进制流中如何区分这个字符是3个字节,还是6个字节呢?UTF-8就是unicdoe其中一个实现方式!注意只是其中一个,还有utf-16、utf-10等等…

二、UTF-8编码规则

使用1-4个字节来存储一个字符,最大的特点是可变长度。

编码规则:

如下表所示:字母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编码规则

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)。

四、GB2312、UTF-8、UNICODE编码(内码或码字)在线查询

http://www.2fz1.com/so/ (本站原创工具,请勿非法访问)

Read more »

谈谈字符集编码及gb2312、utf-8编码原理

一、基础中的基础

比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值。 Byte是字节数,bit是位数,在计算机中每八位为一字节,也就是1Byte=8bit; Byte和bit都翻译成比特,俗称大B(Byte)和小b(bit)

二、GB2312

从GB2312-1980编码开始,汉字都是采用双字节编码。为了与系统中基本的ASCII字符集区分开,所有汉字编码的每个字节的第一位都是1。例如:“啊”字的编码为0xB0A1。(二进制:10110000 10100001) GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。

三、GBK

GB12345和GB13000是对GB2312-1980的扩充,所有已经包含在GB2312中的汉字编码不变,另外增加更多的码位。其编码规则大致为:第一个字节的值在0×81到0xFE之间,第二个字节的值在0×40到0xFE之间。由于GB13000是对GB2312的扩展,所以也被成为GBK。

四、UTF-8

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中的字符集转换

前提是PHP环境要提供iconv支持。

iconv("GB2312", "UTF-8",$str);

七、GB2312 Unicode转换表

http://bbs.ednchina.com/BLOG_ARTICLE_146899.HTM

Read more »

IE6的base标签BUG

当页面存在一个自闭合的base节点,它就会把其“下面”所有的元素都拷到它内部。

此BUG隐秘且危害性大。

解决办法:

将自闭合的标签:

<base href='http://www.2fz1.com/' />

转换为:

<base href='http://www.2fz1.com/'></base>

Read more »

如何让不定宽度的UL相对父级DIV居中

ul居中在oprea和firefox中用margin:0 auto;和text-align:center;就可以轻松的实现了,然而在IE中确是居左显示的,具体的错误原因就有待高手去考证。

下面的方法可以轻松的实现ul居中显示,注意ul和li都必须定义float,否则无效哦。相信大家都知道float:leftfloat: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;
}

Read more »

Starling版本的Flash概要分析类:Stats

一睹为快,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

传统的CPU版本:https://github.com/mrdoob/Hi-ReS-Stats

Read more »

AS3 Vector数组的多种声明及添加项方法

我们知道:和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.

Read more »

js容易被忽略的基础:函数语句和函数表达式的区别及与AS3的区别

在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同时使用的前端开发来讲,掌握两者的其础知识,能避免你犯错!

Read more »

JS判断数组类型的两种方法

一、构造函数法

在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;

原因:

二、特性判断方法

即然上述方法,存在一定的缺陷,我们可根据数组的一些特性来判断其类型,代码如下:

function isArray(object){
    return  object && typeof object==='object' &&   
            typeof object.length==='number' && 
            typeof object.splice==='function' &&   
             //判断length属性是否是可枚举的 对于数组 将得到false 
            !(object.propertyIsEnumerable('length'));
}

有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。

Read more »