如何检测字符串在PHP中是否包含任何补充字符?

问题描述 投票:0回答:1

根据目前为止的理解,第一个字符的supplementary characters(或“代理对”)定义为0xd8000xdbff,第二个字符的定义为0xdc000xdfff

所以我试图检测任意字符串是否包含任何这样的字符:

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?这些不属于上面的定义。那我在这里错了吗?

php utf-16 surrogate-pairs utf-32
1个回答
0
投票

Php内部使用utf8。

根据this,补充字符是大于U+FFFF的Unicode字符。

尝试这种方式:

function hasSupplementaryCharacter($char)
{
    return $char >= 0xffff;
}

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

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

    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.