为了识别双字节的字符, 比如汉字或日文韩文等都是占两字节的, 每字节高位为 1, 而一般西文字符只有一个字节, 七位有效编码, 高位为 0. 而 0x80 对应的二进制代码为 10000000, 最高位为一, 代表汉字...
为了识别双字节的字符, 比如汉字或日文韩文等都是占两字节的, 每字节高位为 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){
- // 大写
- }
如何把所有字母改成大写? 第六位的 1 改成 0 就行了, 代码如下:
- $a='a';
- $a = chr(ord($a)&(~0x20));
- echo $a;
来源: https://www.php1.cn/detail/php-95ac9f5b32.html