将unicode符号转换为\ uXXXX,而不是使用json_encode

时间:2016-10-19 19:19:56

标签: php unicode character-encoding

我需要一个能够将非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);

有没有人知道更简单,更快速的解决方案?

1 个答案:

答案 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方法。