Heim > Artikel > Backend-Entwicklung > 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)。