我知道如果我对模式使用多字节(UTF-8)字符,我必须使用mb_函数,或者必须对preg_函数的模式使用u选项。
但是,当我只对preg_函数的主题使用多字节(UTF-8)字符,对模式只使用ascii字符时,preg_函数(没有u选项)能正常工作吗?
我知道在这种情况下,我必须使用mb_函数或在模式中添加u选项:
$str = preg_replace("/$utf8_multibyte_pattern/", '', $str);我想知道这段代码(未使用u选项)是否安全:
$ascii_pattern = "[a-zA-Z0-9'$#\\\"%&()\-~|~=!@`{}[]:;+*/.,_<>?_\n\t\r]";
$multibyte_str = preg_replace("/$ascii_pattern/", '', $utf8_multibyte_str);发布于 2012-11-08 21:48:12
也许我自己找到了答案。
但是,如果有人非常了解字符代码,请对此答案进行评论或发布另一个答案。
根据维基百科的说法,UTF-8字符代码不包含ascii代码。
http://en.wikipedia.org/wiki/UTF-8#Advantages
UTF-8将ASCII字符本身表示为不会出现在其他任何地方的单个字节,这使得
-8可以与大多数现有API一起工作,这些API接受字节字符串,但只特殊对待一小部分ASCII码。这样就不需要为每个API编写新的Unicode版本,并且与其他Unicode编码相比,将现有系统转换为UTF-8要容易得多。
我认为这意味着带有不带u选项的ascii模式的preg函数对于多字节(UTF8)主题是安全的。
和此代码(不带u选项)
$multibyte_str = preg_replace("/$ascii_pattern/", '', $utf8_multibyte_str);和这段代码(带有u选项)
$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);都是一样的。两者都正常工作。
我说的对吗?
发布于 2012-11-08 20:58:09
据我所知,只要像这样使用unicode属性(/u),它就是安全的:
$ascii_pattern = "[a-zA-Z0-9'$#\\\"%&()\-~|~=!@`{}[]:;+*/.,_<>?_\n\t\r]";
$multibyte_str = preg_replace("/$ascii_pattern/u", '', $utf8_multibyte_str);要查看有关unicode字符的更多信息,请参见here
https://stackoverflow.com/questions/13289259
复制相似问题