background image

PHP 中关于 ord($str)>0x80 的说明

为了识别双字节的字符,比如汉字或日文韩文等都是占两字节的,每字节高位为 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) 
 
发现一个规律:一个 a-z 的字母,只要是小写字母,第六位肯定是 1,我们可以用这个来判
断大小写: 
这时候只要跟用以个字母跟 0x20(100000)来位与判断: 
代码如下:
 

if

(ord(

$a

)&0x20){ 

//

 

大写