PHP не поддерживает Unicode Недостатки в PCRE - PullRequest
1 голос
/ 13 июля 2011

Например, это:

<!-- 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";
    }

?>

Пока вы используете правильные байтовые последовательности для сопоставления символов Юникода.Не нужно ли использовать поддержку Unicode?

или я ошибаюсь?

1 Ответ

2 голосов
/ 14 июля 2011

Для этого конкретного соответствия вам не нужна поддержка 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.

и т. Д.

...