Php / json:解码utf8?

时间:2011-10-10 07:18:07

标签: php json utf-8 character-encoding

我在mysql数据库中存储了一个包含一些(中文?)字符的json字符串。 数据库中的内容示例:

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

在我的PHP页面上,我只是对从mysql收到的内容进行了json_decode,但它显示不正确,它显示的内容如“½±è§ ”

我试图在我的文件开头执行“SET NAMES'utf8'”查询,没有改变任何东西。 我的网页上已经有以下标题:

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

当然我所有的php文件都是用UTF-8编码的。

你知道如何很好地展示这些“\ uXXXX”字符吗?

3 个答案:

答案 0 :(得分: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"
}

答案 1 :(得分: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 -documentation)。这对我有用:

$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);

否则我们需要有关数据库中字符串编码方式的更多信息。

答案 2 :(得分: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");