私がこれまでに理解していることから、補助文字(または「サロゲート ペア」) は、最初の文字が から まで、 2 番目の文字が から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
。
それをテストするために、これらのシンボルがどのようなコードになるかを確認するための小さな Web ページを作成しました。
$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;
しかし、私が得ているエンコーディングは、私が期待したものではありません:
なぜ私にそれを与えてf0, 9f, 98, 8d
いるのですか?それらは上記の定義に該当しません。それで、私はここで何が間違っていますか?