Как определить, содержит ли строка дополнительные символы в PHP? - PullRequest
0 голосов
/ 23 апреля 2020

Насколько я понимаю, дополнительные символы (или "суррогатные пары") определены в диапазоне от 0xd800 до 0xdbff для первого символа и от 0xdc00 и 0xdfff для второго символа.

Поэтому я пытаюсь определить, содержит ли произвольная строка какие-либо такие символы:

function isSupplementaryCharacter($c1, $c2)
{
    return $c1 >= 0xd800 && $c1 <= 0xdbff && $c2 >= 0xdc00 && $c2 <= 0xdfff;
}

function isStringWithSupplementaryCharacters($str)
{
    $ln = strlen($str);

    for($i = 0; $i < $ln - 1; $i++)
    {
        if(isSupplementaryCharacter(ord($str[$i]), ord($str[$i + 1])))
            return true;
    }

    return false;
}

Но, похоже, их не обнаруживается. Например:

isStringWithSupplementaryCharacters("=?!");

возвращает false.

Итак, чтобы проверить это, я написал небольшую веб-страницу, чтобы увидеть, какими кодами становятся эти символы:

$txt = isset($_REQUEST['txt']) ? $_REQUEST['txt'] : '';
$htmTxt = htmlentities($txt);

$hex = '';
$ln = strlen($txt);
for($i = 0; $i < $ln; $i++)
{
    $hex .= dechex(ord($txt[$i])).", ";
}

$htmHex = htmlentities($hex);

echo <<<UUU01
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>

<form method="get">
<input type="text" name="txt"></input>
<input type="submit" value="Go"/>
</form>

<p>$htmTxt</p>
<p>$htmHex</p>

</body>
</html>
UUU01;

Но код, который я получаю для ?, не тот, который я ожидал:

enter image description here

Почему он дает мне f0, 9f, 98, 8d за это? Это не подпадает под определение выше. Так что я тут не так делаю?

...