PHP不支持Unicode支持PCRE中的缺点

时间:2011-07-13 19:58:55

标签: php regex unicode utf-8 pcre

例如:

<!-- All the characters are going to be converted into a Hex values depending the encoding used -->

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- It Just interpret the Hex values that are going to be displayed -->


<?php

/* PHP Strings are bytestream */
/* PHP treat the strings as a Hex values from the econding used */

$string="€"; // Hex value from the Encoding Method(UTF-8). [U+20AC][E2|82|AC]
if(preg_match('/\xE2\x82\xAC/',$string,$m)){
    echo "Match<br>";
    print_r($m);
    }
else{
    echo "Don't Match";
    }

?>

只要您使用正确的字节secuences匹配Unicode字符。 是不是需要使用Unicode支持?

还是我错了?

1 个答案:

答案 0 :(得分:2)

对于该特定匹配,您不需要Unicode支持。任何简单的直接字符串匹配都适用于两个UTF-8字符串 - 这是UTF-8的故意设计功能 - 但如果你需要的只是一个直接的字符串匹配你就不会使用正则表达式:对于你的例子你'最好用strpos

许多其他正则表达式功能在没有Unicode支持的情况下会出现意外行为。例如:

/€*/

支持Unicode,即多个€符号(\xE2\x82\xAC\xE2\x82\xAC\xE2\x82\xAC...)。没有它,这是€符号的前两个字节,然后是任意数量的0xAC字节(\xE2\x82\xAC\xAC\xAC\xAC...),因此它匹配的唯一有效的UTF-8序列将是单个€。

/[x€]/

支持Unicode,匹配x或欧元。没有Unicode支持,匹配x或字节0xE2或字节0x82或字节0xAC。

等等。