2016-10-19 60 views
0

我需要一個將非ASCII符號正確轉換爲\ uXXXX表示形式的函數。 我知道json_encode做到了這一點,但是它爲字符串添加了雙引號,並且我認爲可能會有更精煉的解決方案,比每個符號使用json_encode的情況消耗更少的CPU。將unicode符號轉換爲 uXXXX,而不是使用json_encode

下面是目前的解決方案:

$input=preg_replace_callback('#([^\r\n\t\x20-\x7f])#u', function($m) { 
     return trim(json_encode($m[1]),'"'); 
    }, $input); 

有誰有simplier和更快的解決方案的想法?

回答

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

+0

感謝您的解釋。讓我們把你的答案作爲一個好的選擇。也許有人會測試這兩個選項的速度:)。 – NikitOn