如何工作:chr(($ number>> 6)+192).chr(($ number& 63)+128);

时间:2013-02-07 22:32:13

标签: php utf-8 multibyte chr

请解释一下这行代码与下一个代码的对应关系:

<?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字符。

3 个答案:

答案 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

UTF-8 byte range table