我需要一个函数,它将正确地将非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);
有没有人有一个更简单和更快的解决方案的想法?
由于您当前的解决方案使用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
函数与UTF-8工作。您要么必须使用mb_convert_encoding
,要么必须滚动您自己的UTF-8解码器(见链接问题),这将允许额外的优化。两个字节和三个字节的UTF-8序列映射到单个UTF-16代码单元。四字节序列需要两个代码单元(高代理和低代理)。
如果您的目标是简单性和可读性,那么您可能无法击败json_encode
方法。