2010-12-02 28 views
0

我正在創建一個Web服務來將JSON傳輸到iPhone應用程序。我使用json-framework來接收json,這很好用,因爲它可以自動解碼諸如「\ u2018」之類的東西。我遇到的問題是,似乎沒有一個全面的方法來一舉得到所有的角色。在HTML中將HTML編號的實體轉換爲Unicode以便在iPhone上使用

例如html_entity_decode()獲得大部分東西,但它留下了像‘(‘)。爲了捕獲這些實體並將它們轉換爲json-framework可以使用的東西(例如\ u2018),我使用此代碼將&#轉換爲\ u,將數字轉換爲十六進制,然後剝離結尾分號。

function func($matches) { 
    return "\u" . dechex($matches[1]); 
} 
$json = preg_replace_callback("/&#(\d{4});/", "func", $json); 

這對我來說目前正在工作,但它只是感覺不對。似乎我肯定錯過了一些將要在以後回來困擾我的角色。

有沒有人看到這種方法的缺陷?任何人都可以想到這種方法會錯過的角色?

任何幫助將不勝感激!

回答

5

從哪裏得到這個HTML編碼的輸入?如果你正在抓取一個網頁,你應該使用一個HTML解析器,它將爲你解碼實體和字符引用。如果您在表單輸入數據中獲取它們,則您遇到了編碼問題(請務必將包含表單的頁面以UTF-8的形式提供以避免出現此問題)。

如果必須轉換文本字符的HTML編碼拉伸到JSON,你應該通過HTML解碼然後JSON編碼第一,而不是試圖直接進入JSON格式(這會爲失敗做一堆需要逃避的其他角色)。使用內置的解碼器和編碼器功能,而不是嘗試自己創建JSON編碼的字符,如\u....(因爲那裏有陷阱)。

$html= 'abc " def Ӓ ghi ሴ jkl \n mno'; 
$raw= html_entity_decode($html, ENT_COMPAT, 'utf-8'); 
$json= json_encode($raw); 

"abc \" def \u04d2 ghi \u1234 jkl \\n mno" 
0

‘是一個十進制編號的實體,而我相信\u2018是一個十六進制表示。 HTML也支持十六進制編號的實體(例如,‘),但是一旦您發現#作爲實體前綴,您正在查看十進制或十六進制。還有一些已命名的實體(例如,&),但聽起來不像您需要在代碼中涵蓋這些情況。

+0

它看起來像JSON-框架要求這些實體是在十六進制形式,例如\ u2018,爲了解碼。我的主要問題是爲什麼PHP函數html_entity_decode()沒有趕上‘。這讓我想知道還有什麼沒有抓住。 – 2010-12-02 19:27:39

+0

@Philip:它確實抓住了我,我得到一個解碼的```。 – bobince 2010-12-05 23:26:07

0
$html_escape = ""Love sex magic rise" & 尹真希 ‘"; 
$utf8 = mb_convert_encoding($html_escape, 'UTF-8', 'HTML-ENTITIES'); 
echo json_encode(array(
    "title" => $utf8 
)); 

// {"title":"\"Love sex magic rise\" & \u5c39\u771f\u5e0c \u2018"} 

對於我這個工作做好

相關問題