我需要一个能够将非ASCII符号正确转换为\ uXXXX表示的函数。 我知道json_encode会这样做,但它会在字符串中添加双引号,我认为可能有更精确的解决方案,比每个符号使用json_encode消耗更少的CPU。
以下是目前的解决方案:
$input=preg_replace_callback('#([^\r\n\t\x20-\x7f])#u', function($m) {
return trim(json_encode($m[1]),'"');
}, $input);
有没有人知道更简单,更快速的解决方案?
答案 0 :(得分:2)
由于您当前的解决方案使用u
正则表达式修饰符,我假设您的输入编码为UTF-8。
以下解决方案绝对不简单(除了正则表达式),我甚至不确定它更快,但它更低级别并显示实际的转义过程。
$input = preg_replace_callback('#[^\x00-\x7f]#u', function($m) {
$utf16 = mb_convert_encoding($m[0], 'UTF-16BE', 'UTF-8');
if (strlen($utf16) <= 2) {
$esc = '\u' . bin2hex($utf16);
}
else {
$esc = '\u' . bin2hex(substr($utf16, 0, 2)) .
'\u' . bin2hex(substr($utf16, 2, 2));
}
return $esc;
}, $input);
一个基本问题是PHP没有ord
function that works with UTF-8。您要么必须使用mb_convert_encoding
,要么必须使用自己的UTF-8解码器(请参阅链接问题),以便进行其他优化。两字节和三字节UTF-8序列映射到单个UTF-16代码单元。四字节序列需要两个代码单元(高和低代理)。
如果您的目标是简单性和可读性,那么您可能无法超越json_encode
方法。