php preg_replace 修饰符u的作用

手册中的解释是

”此修正符打开一个与perl不兼容的附加功能. 模式字符串被认为是utf-8的“

啥意思呢 个人也不不知道理解的对不对 说说自己的看法

utf8 是一种可变长度的编码 一个中文的utf8可能是2个 可能是3个也可能是4个字节长度

正式因为这种编码的特殊行 如果你没有告诉php的再处理正则时用的是utf8 php可能自己就乱了 就容易吧中文截断出现乱码

如果加上这个参数呢 他会去分析首字节判断出真正的长度 这样就不会乱了

test('/(\D+)(\d+)\w/u');
function test($pre){
    $str = "六角恐龙:12个";
    $a = preg_replace($pre, '$1$2条', $str);
    echo $a.'<br/>';
}

 

引用别人的utf8解释:

 

UTF,是Unicode Text Format的缩写,意为Unicode文本格式。根据Unicode的编码可以生成UTF编码,转换规则如下:
(1)首先将Unicode的编码转换成二进制形式,这样一个字符对应一个16位的二进制数。

(2)如果Unicode的16位二进制编码的头9位都是0,则用一个字节表示该字符,这个字节的首位是“0”,剩下的7位与原编码中的后7位相同。例如 “\u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示(与原Unicode编码是相同的,只是去掉了原编码的首字节);


(3)如果Unicode的16位二进制编码的头5位都是0, 则用两个字节表示该字符,首字节以“110”开头,该字节后面的5位与源编码中头5个零后面的5位相同;第二个字节以“10”开头,后面的六位则与源编码 中剩下的6位相同。例如“\u025d”(0000 0010 0101 1101),转化后为“c99d”(1100 1001 1001 1101);


(4)如果Unicode的16位二进制编码不符合上述两个规则,则用三个字节表示该字符。第一个字节以“1110”开头,后四位 与源编码的头4位相同;第二个字节以“10”开头,后六位与原编码接下来的6位相同;第三个字节也以“10”开头,后六位与原编码剩下的6位相同,这样原 来16位的编码就转换成三个字节24位的编码了;例如“\u9da7”(1001 1101 1010 0111),转化为“e9b6a7”(1110 1001 1011 0110 1010 0111)。

posted @ 2013-05-15 01:51  pang18a  阅读(618)  评论(1编辑  收藏  举报