2

您能否解释一下这行代码如何等效于下一个代码:

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

4

3 回答 3

2

$number >> 6是二元右移操作,即:11000000 >> 6 == 00000011相当于$number / pow(2,6)aka$number / 64

$number & 63AND是一个二进制文件00111111

两者作为二元运算的速度要快得多,因为它们处理的是一两个幂。

于 2013-02-07T22:39:02.227 回答
2

上面的代码使用二元运算符。 >>是右移运算符。它将数字中的位向右移动(朝向更重要的位)。

所以11110000 >> 2 = 00111100

相当于除以 2 的幂 $number >> $n等于$number / pow(2,$n)

是“&按位与”运算符。它比较两个数字上的相应位,并设置两个数字中的结果1

11110000 & 01010101 = 01010000

通过$number与 63 ( 001111111) 进行与运算,得到除以$number64 的余数(也称为模数),写成$number % 64

于 2013-02-07T22:40:01.090 回答
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 - 无效

Table Reference : https://en.wikipedia.org/w/index.php?title=UTF-8&oldid=388157043

UTF-8 byte range table

于 2018-02-12T11:32:47.167 回答