2011-10-10 140 views
1

我存儲一個json字符串,它包含mysql數據庫中的一些(中文?)字符。一個什麼樣的數據庫實例 :Php/json:解碼utf8?

normal.text.\u8bf1\u60d1.rest.of.text 

在我的PHP頁面我只是在做什麼,我從MySQL收到json_decode,但它並沒有顯示正確的,它表明的東西像「1/2±è§」

我試着在我的文件的開頭執行「SET NAMES'utf8'」查詢,並沒有改變任何東西。 我已經在我的網頁下面的頭:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

,當然還有我所有的PHP文件以UTF-8編碼。

你知道如何很好地顯示這些「\ uXXXX」字符嗎?

+0

這些是應該顯示的字符:誘惑? –

+0

向我們展示更多你正在做什麼。 'echo json_decode(''\ u8bf1 \ u60d1'');'應該很好地完成這個技巧。 – deceze

回答

3

Unicode是不是UTF-8!

$ echo -en '\x8b\xf1\x60\xd1\x00\n' | iconv -f unicodebig -t utf-8 
誘惑 

這是一個奇怪的「編碼」,你有。我猜正常文本的每個字符都是「一個字節」長(US-ASCII)?然後,您必須提取\ u ....序列,將序列轉換爲「兩字節」字符,並將該字符與iconv("unicodebig", "utf-8", $character)轉換爲UTF-8字符(請參閱PHP文檔中的iconv)。這工作在我身邊:

$in = "normal.text.\u8bf1\u60d1.rest.of.text"; 

function ewchar_to_utf8($matches) { 
    $ewchar = $matches[1]; 
    $binwchar = hexdec($ewchar); 
    $wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF); 
    return iconv("unicodebig", "utf-8", $wchar); 
} 

function special_unicode_to_utf8($str) { 
    return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str); 
} 

echo special_unicode_to_utf8($in); 

否則,我們需要更多關於如何在數據庫中的字符串編碼的信息。

+0

非常感謝,它的工作! – Quentin

+1

編碼是'json_encode()'(或其他兼容編碼器)的結果,'json_decode()'應該足以將其轉換回來。 –

+0

@ fromherehere:你可能是對的,但不應該JSON編碼器輸出有效的Javascript?因爲引號(「)缺少它的正文,而不是真正的JSON。在我這邊,'json_decode'的一部分也打印出正確的結果,就像在你的回答中一樣 – vstm

2

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

這是一個紅鯡魚。如果您通過http提供頁面,並且響應包含一個Content-Type標題,那麼元標記將被忽略。默認情況下,PHP會設置這樣一個頭,如果你沒有明確地做。默認設置爲iso-8859-1

嘗試用這一行:

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
+0

沒有改變任何東西。另外我不得不提一下,firefox說這個頁面是UTF8,所以我猜這個頭文件已經很好了? – Quentin

8

這似乎在Ubuntu 11.04做工精細對我來說,使用PHP 5.3.5:

<?php 
header('Content-Type: text/plain; charset="UTF-8"'); 
$json = '[ "normal.text.\u8bf1\u60d1.rest.of.text" ]'; 

$decoded = json_decode($json, true); 

var_dump($decoded); 

輸出這樣的:

array(1) { 
    [0]=> 
    string(31) "normal.text.誘惑.rest.of.text" 
}