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