您能否解释一下这行代码与下一行代码的等价性:
<?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);
}例如,输入number 1989都会生成߅
这些代码用于将UNICODE实体转换回原始UTF-8字符。
发布于 2013-02-08 06:40:01
上面的代码使用二元运算符。>>是右移运算符。它将数字中的位向右移位(朝向更重要的位)。
所以11110000 >> 2 = 00111100
它等同于被2的幂除$number >> $n与$number / pow(2,$n)相同。
&是“按位与”运算符。它比较两个数字上的相应位,并在结果中设置两个数字都为1的那些位。
11110000 & 01010101 = 01010000
通过将$number与63 (001111111)进行and运算,可以得到$number除以64 (也称为模数)的余数,这就是$number % 64。
发布于 2013-02-08 06:39:02
$number >> 6是一个二进制右移操作,即:11000000 >> 6 == 00000011等同于$number / pow(2,6),也就是$number / 64
$number & 63是带有00111111的二进制AND
这两种运算都比二进制运算快得多,因为它们都需要处理一两次幂。
发布于 2018-02-12 19:32:47
加上@Mchl的答案,在UTF序列中添加192的原因是发出字节信息开始的信号
192 - 11000000 -2字节序列的开始( 128 + 64)
11100000 -3字节序列的开始( 128 + 64 + 32)
240 - 11110000 -4字节序列的开始( 128 + 64 + 32 + 16)
248 - 11111000 -5字节序列的开始(受限) (... + 8)
11111100 -6字节序列的开始(受限) (... + 4)
254 - 11111110 -无效
表参考:https://en.wikipedia.org/w/index.php?title=UTF-8&oldid=388157043
https://stackoverflow.com/questions/14762311
复制相似问题