Php/json: decode utf8?


Php/json: decode utf8?

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

normal.text.'u8bf1'u60d1.rest.of.text

在我的PHP页面上,我只是做了一个json_decode我从mysql收到的,但它没有显示正确,它显示的东西像"½±è§§"

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

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

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

你知道如何很好地显示这些"'uXXXX"字符吗?

这对我来说似乎工作得很好,在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"
}

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

否则我们需要更多关于数据库中字符串如何编码的信息

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