首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作原理: chr(($number >>6 )+192).chr(($number & 63)+128);

工作原理: chr(($number >>6 )+192).chr(($number & 63)+128);
EN

Stack Overflow用户
提问于 2013-02-08 06:32:13
回答 3查看 209关注 0票数 2

您能否解释一下这行代码与下一行代码的等价性:

代码语言:javascript
复制
<?php
$string = chr( ( $number >> 6 ) + 192 ).chr( ( $number & 63 ) + 128 );
?>

它相当于:

代码语言:javascript
复制
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字符。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2013-02-08 06:39:02

$number >> 6是一个二进制右移操作,即:11000000 >> 6 == 00000011等同于$number / pow(2,6),也就是$number / 64

$number & 63是带有00111111的二进制AND

这两种运算都比二进制运算快得多,因为它们都需要处理一两次幂。

票数 2
EN

Stack Overflow用户

发布于 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

UTF-8 byte range table

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14762311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档