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


Convert unicode symbols to uXXXX, not using json_encode

我需要一个函数,它将正确地将非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方法。