变量命名规则:
1. 变量名区分大小写(case-sensitive) 。
2. 必须字母或下划线开头。变量名可由 字母、数字、下划线组成。
看 到这里可能,不少人纳闷了~。那为啥 $我是变量 这样的中文也能作变量名呢? 在PHP里,中文的确是能够作变量名的(能用是能用但千万别项目上用....) 。 由于这里的字母是指: a-z A-Z 和 扩展ASCII 字符里从 127 到 255 ,16进制表示为:0x7f-0xff 。 那意思就是ASCII字符里从127到255 (0x7f-0xff) 涵括了中文? 的确是这样的。下面就简单的讲下编码。
ASCII 、GB23十二、GBK、UTF-8 编码:
ASCII :
ASCII 编码里包括了128个字符。用 十进制 0 到 127 来表示 。那就对了, 0 到 127 不就是 128个字符吗。 每个数字都表明一个字符。看ASCII 编码表
我 们先看十进制(Dec) 这列,看到了吗 。 十进制数字 9 对应 的字符是 咱们开发用得最多的 TAB键。 再看看 48 对应的字符是 0 。没错从 ASCII 48开始 到57 都表示数字 0到9 。 ASCII 97 到 122 表示 小写字母 a 到 z 。 好比: 咱们看到的字母 a ,其实计算机并不认识啥 字母a , 她只认识 97。 她把a 转成了 ASCII 97来进行存储。下面用PHP 来玩玩 ASCII 。
来咱们认识两个函数:
ord ---- Return ASCII value of character 返回 字符的 ASCII 值 。
chr ---- Return a specific character 返回 ASCII 对应的 字符。
翠花上例子:
<?php echo(ord('a'));?>
//输出 97
没错吧, 小写a的 ASCII 就是 97。 要把 ASCII 97 对应的字符打印出来:
<?php echo(chr(97));?>
//输出 a
恩。看完基本就明白了。 ASCII 编码 里面包括了 大小写字母 数字 和 一些经常使用的控制字符。 这样在使用英语的国家基本就能使用了。计算机存储的是ASCII 。 人看到的就是 ASCII 对应的字符。
GB2312 编码:
世界上并不全是用英语做为语言的。好比我国用的是中文。小日本用的是 日语。 韩国用的是韩文。 这些语言和英语彻底不是一回事。 你看ASCII 表上有中文对应的”数字“吗?没有吧。由于还有一份 GB2312编码表 ,和ASCII 编码表道理同样。 连接: http://wenku.baidu.com/view/244e2d2ce2bd960590c677a6.html 你们打开一看,哎呀~~! 是否有点乱乱,找不到头绪,啥乱七八糟。 不过当明白原理,就容易看懂了。
在 GB2312编码里面,一个字符咱们须要用两个字节来进行存储和表示。咱们记得ASCII 编码里面 一个字符只须要一个字节。因此以GB2312存储数据比 ASCII 大一倍。 那么GB2312 这两个字节,分别放啥数字 才能表示字母 a 呢? 咱们知道 ASCII 编码 a 就一个字节表示,编码97。 GB2312 编码比 ASCII 复杂一点,
在要看懂 GB2312编码表以前,首先咱们要学习下”区位码“。
区位码概念:
GB2312对汉字和其余字符(字母,数字等)进行了“分区”。
01-09区为特殊符号(数字呀、字母呀等)。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
分区是啥?好比我是广西的,你是河南的、他是广东。 也就是说每一个字符确定存在于某个区里。 这种表示方式叫作 “区位码”。 区位码 实际上是 区号和位号(表示一个字符在这个哪一个区里的第几列) 。 你想知道每一个汉字的区位码?简单呀。给你个连接本身查去 http://www.jscj.com/index/gb2312.php
我 们以 “啊” 这个汉字来查它的区位码。 以上图所示 1601 是 “啊”这个汉字的区位码。 区号是 16 , 位号 01。 若是你们还记得, 16区 是 一级汉字哦。牛X呀。一级汉字是啥意思? 我估计是经常使用的汉字?~我也不知道,这个是国内专家定义的。 位号 是 01 ,位号其实就是说你在这个区里排行老几。 有了 x轴(区号)和y轴(位号) 那么天然就又个交点,经过交点就能在 GB2312编码表上找到对应的汉字了。
若是你如今就去看 GB2312的编码表,我估计你仍是看不懂,虽说经过区位码就能定位到GB2312编码的字符了。可是GB2312编码表上并没那么单纯。 还要继续往下看。
上面咱们说的是GB2312的 区位码: 区号和位号。 前面我说过,一个GB2312的字符 是用两个字节来表示的:(高位字节,低位字节)。第一个字节称为“高位字节” ,第二个字节称为“低位字节” ps:由于高的通常排左边吧~ 因此叫 高位字节.... 。
算法以下: 一个GB2312的字符 == (0xA0 + 区号,0xA0 + 位号)。按照这个算法,你再取看 GB2312编码表,你就看得如鱼得水了。
0xA0 是啥意思呢? 为啥高位字节 等于 区号 加上 0xA0 。 为啥低位字节 等于 位号 加上 0xA0呢。这样组合起来的两个字节就能表示一个 GB2312的字符? 没错,就是那么简单。 0xA0 是一个16进制数字 换算成 十进制其实就等于 160 。 高位字节 等于 160 加上 区号,你能够理解为,其实就是 GB2312编码字符 是从 160 起步的。 就比如 ASCII 编码是从 0开始 到 127 结束。
咱们从新来看下算法 : 一个GB2312的字符 == (0xA0 + 区号,0xA0 + 位号) 。
以 上所看,只要咱们知道 区位码(区号和位号)就能算出一个汉字的GB2312编码数字。 字母a 的区位码 : 0365 ,也就是区号 03 位号 65 。 按照上面算法咱们算下。 把 0xA0 换成十进制 等于 160。 也就是 (160+03,160+65) 等于 (163,225) 换成 16进制(编码表通常都是16进制) (A3,E1) 。 OK了。 字母a 的gb2312编码 出来了,拿着 A3E1去 GB2312编码表去找这个16进制数字对应的字符吧。 若是你没看错的话,没错就是对应着 编码表上的字母 a 。
因此, 只要记得 上面公式, 找个工具算出汉字区位码,而后套进公式里面算下。就能的到这个字符的GB2312编码值了。 你们能够本身动手去试试算出上面的汉字 “啊” 的GB2312的编码值。
小总结一下,你们记住:
ASCII 编码的范围 -- 十进制 => 0 - 127 。 十六进制: 0x00 - 0x7F 。
GB2312编码的范围 -- 十进制 => 高位字节:161 - 247 。十六进制:0xA1 - 0xF7 , 低位字节: 161 - 254 。十六进制:0xA1 - 0xFE 。
GBK 编码:
GB2312 之上的一种扩展编码,GBK 编码已经包括了GB2312编码,并扩展了GB2312编码,使它能表示更多的字符。 GB2312和GBK 原理同样,他们区别只是,编码值范围不同了。 GBK 更大了。
GB2312 编码值范围 : 高字节从A1到F7,而低位字节从A1到FE。
GBK 编码值范围: 高字节从81到FE,而低位字节从40到FE 。
以上范围能够看出。GBK 比 GB2312大不少。 大是大了不少... 不过如今通常项目都用UTF-8编码了。 接下来将下UTF-8编码方式
UTF-8编码:
世 界上那么多国家,每一个国家的语言都不同。一会出个 ASCII 一会出个 GBK 一会出个 XXOO 编码。那崩溃了。是否能发明一种编码方式,能很好的表示出全部语言呢? Unicode编码就是这样产生的。这里咱们只讲Unicode中得一种实现方式。UTF-8,固然还有其余的实现方式。但对于咱们WEB开发来讲,并不 经常使用。
ASCII 编码能很好的表示字母、数字等。因此UTF-8 就在它的基础上进行了一下扩展。 按照惯例,咱们仍是先看下 Unicode编码 表(UTF8编码表?木有。咱们须要掌握如何从Unicode 转换成 utf8)
学习这节的目的php
unicode 字节位表html
unicode 编码范围 十进制/十六进制 |
UTF-8 字节模板二进制/十六进制 |
字节数 |
(0)000000 – (127)00007F |
0xxxxxxx(00-7F) |
一字节 |
(128)000080 – (2047)0007FF |
110xxxxx(C2-DF) 10xxxxxx |
两个字节 |
(2048)000800 – (55295)00D7FF (57344)00E000 – (65535)00FFFF |
1110xxxx(E0-EF) 10xxxxxx 10xxxxxx |
三个字节 |
(65536)010000 – (1114111)10FFFF |
11110xxx(F0-F4) 10xxxxxx 10xxxxxx 10xxxxxx |
四个字节 |
这个表很重要,记下这个表就基本了解了UTF-8 是怎么一回事。 UTF-8 一共能用四个字节来表示。 但通常字符呢基本用三个字节就能知足了。
一个字节等于8位。这个你们都知道。 从 00000000 - 11111111 这个就是一个字节的数值范围。 换算成十进制就是 0 - 255 。 懂了这个咱们继续往下讲。
继续看上图, 咱们慢慢讲:
UTF-8中之 一字节:
在UTF-8里面对ASCII 编码进行了保留而后再它之上进行了扩展补充。 一个字节 存的 仍是字母呀 数字呀 和ASCII 编码同样。因此 编码范围也是 0 - 127 。
有 点同窗纳闷为啥是 127 呢? 一个字节换算成二进制不是 255吗? 由于一字节的时候,第一位给借去了,第一位的值为 固定为0 。你们看上图第一行 “UTF-8字节模板“ 这一列 就明白了。因此其实只有7位是用来表示字符。那么 换算了下 7位 的二进制 就只有 0 - 127 了。 这个几乎和ASCII 编码同样, 想知道0 - 127 都分别对应了什么字符? 看ASCII 编码表呀。
UTF-8 之两字节:
一 个字节 8位,两个字节就16位了。哇!值更大了,能表示的字符更多了。因此什么希腊字母呀、拉丁字母呀等均可以用两字节来表示了。 看 第二行的 ”UTF-8字节模板“ 这一列 。110xxxxx 10xxxxxx 一共有16位, 每8位一个字节。 你们知道,在一个字节的时候,第一位是不能用的。 两个字节的时候稍微不一样了。 在两个字节的时候, 第一个字节的前三位给借去了,同时第二个字节的前两位也是给借去了。 恩在这里,咱们只要明白一个地方就行。 UTF-8 编码中 当字符是两个字节表示的时候,第一个字节的编码值范围是多少? 第一个字节是 : 110xxxxx 。 那么也就是范围从 11000000 - 11011111 换成十六进制范围是 C2 - DF 。 恩懂这一点,就足够了。 之后遇到 写 UTF-8编码 下的 截取 函数 、统计长度函数 就不用怕了。
UTF-8 之三字节:
三 个字节表示,是咱们用的最多的,由于俺们写中文的嘛。 不过这里注意下就是 ,三字节下的借位状况。 继续看上图 。 1110xxxx(E0-EF) 10xxxxxx 10xxxxxx 看到了吗?你懂的~ 若是还不懂...仍是继续重头看起吧。 UTF-8 下 一个字符三字节的。 第一个字节 的范围是多少? 这个必须弄清楚。 范围是从 11100000 - 11101111 十六进制是: E0 - EF 。
UTF-8 之四字节:
这个遇到真很少。 不过道理 你真懂了。我就不说了
好了。咱们完成了一个目标了 : 判断UTF-8下的字符的字节数。好比之后开发你遇到:
对 于这段文字 : "逆雪寒之PHP拾遗" 。 我要在UTF-8下统计它的字符长度 和 实现截取字符窜。 应该没那么心慌了。 固然有人说,统计字符长度和截取中文字符窜不是很简单吗?mb_strlen 、 mb_substr 。 的确是能够呀。 但我想咱们要知其然知其因此然 。 咱们的目标是 PHP产品级研发。 不是 PHP企业网站级研发 -_-! 。
接下来完成另一个目标: 掌握从Unicode 转换成utf8编码的方法
我 们继续看 unicode 字节位表 。 看第一列 unicode 编码范围 。 四个字节,因此就有四个范围 。 看这个 (0)000000 – (127)00007F 十进制从 0 开始到 127 。这个就是第一字节的unicode 范围。 其余的也是同一个意思。
明白了上面讲的之后,如今开始讲 unicode 编码转换 UTF-8的流程:
咱们用 “啊” 这个汉字为例,它的 Unicode 编码是 U+554A (怎么知道的?查 unicode 编码表呀 大哥...) 。 而后咱们转成UTF-8 :正则表达式
附送: Unicode 编码表 http://wenku.baidu.com/view/01a4feeae009581b6bd9ebe1.html
终 于讲完了编码。。。 那么回过头来。。讲了那么多废话就是为了解释。 为啥 PHP能用中文来作变量名。 PHP官方文档给的 变量名正则表达式'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' 。 里面的\x7f \xff 我想你们都明白了吧。。。 \x7f - \xff 的十进制是: 127 - 255。 那么按照咱们以前上面讲的那些 编码规则~ 每一个字节的编码 都是在 127 - 255范围以内对吧?除了一字节。 那么也就是说 中文不管是GBK GB2312 仍是UTF-8编码的, 用来作变量名都是符合了'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' 这条正则的。 接下来咱们也不要浪费了前面所学了哪些编码知识。。咱们要应用,咱们要深刻了解...因此开始写两个函数,估计你们都在开源的代码。好比啥 phpcms 啥 uchome discuz 里面 看到过相似这些函数。没错~~! 理解完上面的编码知识。我相信 这些对你来讲~~ 小菜一碟...算法