我正在寻找一种在PHP中创建有效的UTF-16 JavaScript转义序列字符(包括代理对)的方法。
我使用以下代码获取UTF-32代码点(从UTF-8编码的字符)。这可以作为JavaScript转义字符(例如,'\u00E1'表示'á') - 直到您进入更高的范围,其中您会得到代理对(例如''变成了'\u1D715'但应该是'\uD835\uDF15')...
我使用以下代码获取UTF-32代码点(从UTF-8编码的字符)。这可以作为JavaScript转义字符(例如,'\u00E1'表示'á') - 直到您进入更高的范围,其中您会得到代理对(例如''变成了'\u1D715'但应该是'\uD835\uDF15')...
function toOrdinal($chr)
{
if (ord($chr{0}) >= 0 && ord($chr{0}) <= 127)
{
return ord($chr{0});
}
elseif (ord($chr{0}) >= 192 && ord($chr{0}) <= 223)
{
return (ord($chr{0}) - 192) * 64 + (ord($chr{1}) - 128);
}
elseif (ord($chr{0}) >= 224 && ord($chr{0}) <= 239)
{
return (ord($chr{0}) - 224) * 4096 + (ord($chr{1}) - 128) * 64 + (ord($chr{2}) - 128);
}
elseif (ord($chr{0}) >= 240 && ord($chr{0}) <= 247)
{
return (ord($chr{0}) - 240) * 262144 + (ord($chr{1}) - 128) * 4096 + (ord($chr{2}) - 128) * 64 + (ord($chr{3}) - 128);
}
elseif (ord($chr{0}) >= 248 && ord($chr{0}) <= 251)
{
return (ord($chr{0}) - 248) * 16777216 + (ord($chr{1}) - 128) * 262144 + (ord($chr{2}) - 128) * 4096 + (ord($chr{3}) - 128) * 64 + (ord($chr{4}) - 128);
}
elseif (ord($chr{0}) >= 252 && ord($chr{0}) <= 253)
{
return (ord($chr{0}) - 252) * 1073741824 + (ord($chr{1}) - 128) * 16777216 + (ord($chr{2}) - 128) * 262144 + (ord($chr{3}) - 128) * 4096 + (ord($chr{4}) - 128) * 64 + (ord($chr{5}) - 128);
}
}
我该如何修改这段代码以获取正确的UTF-16代码点?谢谢!
$utf16 = iconv(fxCHARSET, 'UTF-16BE', $text); for ($i= 0; $i < strlen($utf16); $i+= 2) { $output.= '\\u'.str_pad(dechex((ord($character{$i}) << 8) + ord($character{$i+1})), 4, '0', STR_PAD_LEFT); }
- user308618