2011-10-07 39 views
3

我有一個ISO字符串,我從數據庫中獲取,當我utf8_encode它,我得到一個\ u00f6而不是Ö。這混淆了javascript/html這個PHP腳本的Ajax。爲什麼會有一個?而不是Ö?如何獲得Ö?php utf8_encode - 字符獲得前綴 u

編輯: 好的,我做了一些更多的實驗,結果發現這是由utf8_encode和json_encode的組合引起的。雖然如果我根本沒有使用utf8_encode,那麼json中的值將爲null。

json_encode(array("city"=>utf8_encode("göteborg"))) 
+0

從您的ajax頁面粘貼您的php代碼,進行轉換和打印。 – jishi

+0

我希望這會做。 – quano

回答

9

utf8_encode不會將字符編碼爲\uxxxx,因爲您已經想出了它的json_encode這樣做。這很好,因爲JSON格式指定了這種行爲。如果您的客戶端正確地將JSON字符串解碼爲Javascript數據類型,則\uxxxx轉義符將轉換爲正確的Unicode字符。

至於json_encode丟棄的字符,如果你的字符串Latin1的編碼:它沒有明確的手冊頁上註明,但完全基於Javascript和JSON Unicode的,所以我懷疑Latin1的是一個無效的和意想不到的編碼,JSON字符串使用,所以它打破了。

1

如何打印? javascript原生支持\ uXXXX編碼,並在javascript中執行此操作:

var x = "\u00f6"; alert(x); 

應打印出一個小的ö。

編輯:根據你的代碼,如果你直接輸出到響應流並在客戶端使用實際響應作爲js中的變量,則根本不應該關心json_encode。

你只想告訴大家,內容通過設置Content-Type頭是UTF8瀏覽器:

header('content-type: text/plain;charset=utf8'); 

然後是jQuery.data()的代碼會工作得很好。

+0

我設置了一個jQuery.data(值)的輸入,然後我獲取這些數據並將其放入一個元素中。我直接在html中獲得了\ u00f6。奇怪的是,如果我在PHP中執行utf8_encode(「$ lots of $ variables」),我不會得到\ uxxxx,但是如果我執行utf8_encode($ variable),我確實會得到\ uxxxx。 – quano

+0

是否重視您的XHR請求的實際響應?我猜想生成的輸出(但我不認爲它是utf8_encode)是輸出到js代碼,這意味着json序列化或等效。因此,如果你只是想要輸出並放入一個變量,它不應該被編碼。 – jishi

+0

+1。如果你檢查http://json.org/,你會發現,'\ u00f6'是有效的JSON,代表'ö'。另外它還有一個額外的好處,可以使您的JSON響應嚴格保留在ASCII集中。 – Boldewyn