首页 > php教程 > PHP源码 > PHP ord($str)>0x80的自我理解详解

PHP ord($str)>0x80的自我理解详解

WBOY
发布: 2016-06-08 17:24:39
原创
1418 人浏览过

GBK简体字符集的编码是同时用1个字节和2个字节来表示的。当高位是0x00~0x7f时,为一个字节,高位为0x80以上时用2个字节表示


为了识别双字节的字符,比如汉字或日文韩文等都是占两字节的,每字节高位为1,而一般西文字符只有一个字节,七位有效编码,高位为0

而0x80对应的二进制代码为1000 0000,最高位为一,代表汉字.汉字编码格式通称为10格式. 一个汉字占2字节,但只代表一个字符

GBK简体字符集的编码是同时用1个字节和2个字节来表示的。当高位是0x00~0x7f时,为一个字节,高位为0x80以上时用2个字节表示"


注:括号里面都是2进制
当你发现一个字节的内容大于0x7f,那它肯定是个(跟另外一个字节拼凑成一个)汉字,如何判断肯定大于0x7f呢?

0x7f(1111111)后面一个数就是0x80(10000000),所以想要大于0x7f,这个字节的最高位都肯定是1,我们只需要判断这个最高位是否为1就行了。


判断方法:
位与(相同的位都是1的才为1,否则为0):
如:要判断一个数的第三位是否是1,只要跟4(100)位与,判断一个数的第2位是否为1就跟2(10)位与.

同理判断第八位是否为1只要跟(10000000)也就是0x80位与了.

这里为什么不用>0x7f,php可能还行,但在其他强类型语言里面,1个字节的最高位用来标示负数,一个负数肯定不可能大于0x7f(最大的整数)

再举个例子:
 代码如下 复制代码

a的assic码是97(1100001)
A的assic码是65(1000001)

b的assic码是98(1100010)
b的assic码是66(1000010)

b的assic码是66(1000010)
 代码如下

复制代码
 代码如下 复制代码
if(ord($a)&0x20){
        //大写
}
a的assic码是97(1100001)

A的assic码是65(1000001)

 代码如下 复制代码
$a='a';
$a        = chr(ord($a)&(~0x20));
echo $a;
b的assic码是98(1100010)
<script>ec(2);</script> 发现一个规律:一个a-z的字母,只要是小写字母,第六位肯定是1,我们可以用这个来判断大小写: 这时候只要跟用以个字母跟0x20(100000)来位与判断:
 代码如下 复制代码
if(ord($a)&0x20){         //大写 } 如何把所有字母改成大写?第六位的1改成0就行了:
 代码如下 复制代码
$a='a'; $a        = chr(ord($a)&(~0x20)); echo $a;
相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板