我在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”字符吗?
答案 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");