请解释一下这行代码与下一个代码的对应关系:
<?php
$string = chr( ( $number >> 6 ) + 192 ).chr( ( $number & 63 ) + 128 );
?>
相当于:
if ( $number >=128 && $number <=2047 ){
$byte1 = 192 + (int)($number / 64); //= 192 + ( $number >> 6 )
$byte2 = 128 + ($number % 64); //= 128 + ( $number & 63 )
$utf = chr($byte1).chr($byte2);
}
例如输入数字1989都产生߅
这些代码用于将UNICODE实体转换回原始的UTF-8字符。
答案 0 :(得分:2)
$number >> 6
是一个二进制右移操作,即:11000000 >> 6 == 00000011
相当于$number / pow(2,6)
又名$number / 64
$number & 63
是带有AND
00111111
由于它们处理的是两个或两个权限,所以两者都要快得多。
答案 1 :(得分:2)
顶部的代码使用二元运算符。
>>
是右移运营商。它将数字中的位向右移动(朝向更高有效位)。
所以11110000 >> 2 = 00111100
相当于2的幂除法
$number >> $n
与$number / pow(2,$n)
相同。
&
是“按位和”运算符。它比较两个数字上的各个位,并将结果设置为两个数字中的1
。
11110000 & 01010101 = 01010000
通过和$number
和63(001111111
),你得到余下的$number
除以64(又称模数),写成$number % 64
。< / p>
答案 2 :(得分:0)
添加到@ Mchl的答案,在UTF序列中添加192的原因是发信号通知字节信息的开始
192 - 11000000 - 2个字节序列的开始(128 + 64)
224 - 11100000 - 3个字节序列的开始(128 + 64 + 32)
240 - 11110000 - 4个字节序列的开始(128 + 64 + 32 + 16)
248 - 11111000 - 5字节顺序开始(受限制)(... + 8)
252 - 11111100 - 6字节顺序开始(受限制)(... + 4)
254 - 11111110 - 无效
表格参考:https://en.wikipedia.org/w/index.php?title=UTF-8&oldid=388157043