2011-10-10 155 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" 
}