2011-09-23 57 views
2

我在原生PHP 5實現json_encode()中遇到了一個有趣的行爲。顯然,在將對象序列化爲json字符串時,編碼器會將包含「捲曲」引號的任何屬性都置空,這種類型可能會在啓用自動轉換的情況下複製粘貼出MS Word文檔。JSON編碼和捲曲引號

這是函數的預期行爲嗎?我能做些什麼來迫使這些角色轉向基本的等值?我檢查了數據庫返回的數據和管理頁面之間的字符編碼不匹配,插入它和一切正確設置 - 它絕對看起來像編碼器只是因爲這些字符拒絕這些值。有其他人遇到過這種行爲嗎?

編輯:

澄清;

MSWord將採用標準引號和插頁,並將它們轉換爲更審美的「花哨」或「捲曲」引號。這些字符放置在內容管理器中時會導致問題,這些內容管理器在其編輯界面(在html中)與數據庫編碼之間存在字符集不匹配。不過,這不是問題。例如,我有代表一個人的個人資料和字符串JSON_OBJECT:

Jim O’Shea

爲apostraphe作爲UTF編碼\u2019

會出來空的JSON對象時,從數據庫中直接獲取json_encoded。

{"model_name":"Bio","logged":true,"BioID":"17","Name":null,"Body":"Profile stuff!","Image":"","Timestamp":"2011-09-23 11:15:24","CategoryID":"1"}

+2

你能舉一個具體的例子嗎? –

+0

我不確定你的意思是「將任何包含'捲曲'花括號的字符串屬性歸零」。但是,我測試了'json_decode()'字符串''{「{a}」:「{b,c,d}」}「'並且它按預期工作。 – 2011-09-23 15:12:51

+0

@Jack curly **引號,**不是大括號。 –

回答

4

從來沒有這個具體問題(即與json_encode()),但一個簡單的 - 雖然有點難看 - 我在其他地方使用的解決方案是循環你的數據並通過它通過這個功能,我從什麼地方得到(將認可它,當我發現在那裏我得到了它):

function convert_fancy_quotes ($str) { 
    return str_replace(array(chr(145),chr(146),chr(147),chr(148),chr(151)),array("'","'",'"','"','-'),$str); 
} 
1

如果我需要做的是,我第一次將文本複製到記事本中,然後從那裏複製。記事本強制它是正常的引號。從來沒有通過代碼,雖然...

2

json_encode有默默滴串的壞習慣,它發現無效的(即非UTF8)字符。 (參見這裏作背景:How to keep json_encode() from dropping strings with invalid characters

我的猜測是捲曲的引號出錯了字符集,或者一路轉換。例如,它可能是您的數據庫連接是ISO-8859-1編碼的。

你能說清楚數據來自何種格式嗎?