我有一组通过JSON从DB(编码的UTF-8)传递的关键字,其中一些可能有特殊字符,如é,è,ç等。这用作自动的一部分完成者。例如:
array('Coffee', 'Cappuccino', 'Café');
我应该补充说,来自数据库的数组将是:
array('Coffee', 'Cappuccino', 'Café');
但JSON编码为:
["coffee", "cappuccino", null];
如果我通过print_r()打印它们,它们在UTF-8编码的网页上显示正常,但如果我想使用print_r查看数组,如果使用text / plain,则café会以“café”形式出现。 $阵列);出口();
如果我在编码到JSON之前使用utf8_encode()编码,它会很好,但在网页上打印的是“café”而不是“café”。
也很奇怪,但json_last_error()被视为未定义的函数,但json_decode()和json_encode()工作正常。
关于如何从数据库中获取UTF-8编码数据在整个过程中表现相同的任何想法?
EIDT:这是PHP函数,它抓取关键字并将它们组成一个数组:
private function get_keywords()
{
global $db, $json;
$output = array();
$db->query("SELECT keywords FROM listings");
while ($r = $db->get_array())
{
$split = explode(",", $r['keywords']);
foreach ($split as $s)
{
$s = trim($s);
if ($s != "" && !in_array($s, $output)) $output[] = strtolower($s);
}
}
$json->echo_json($output);
}
json :: echo_json方法只是编码,设置标题并打印它(用于Prototype)
编辑:数据库连接方法:
function connect()
{
if ($this->set['sql_connect'])
{
$this->connection = @mysql_connect( $this->set['sql_host'], $this->set['sql_user'], $this->set['sql_pass'])
OR $this->debug( "Connection Error", mysql_errno() .": ". mysql_error());
$this->db = @mysql_select_db( $this->set['sql_name'], $this->connection)
OR $this->debug( "Database Error", "Cannot Select Database '". $this->set['sql_name'] ."'");
$this->is_connected = TRUE;
}
return TRUE;
}
更多更新: 我跑的简单PHP脚本:
echo json_encode( array("Café") ); // ["Caf\u00e9"]
echo json_encode( array("Café") ); // null
答案 0 :(得分:11)
原因可能是当前的客户端字符设置。一个简单的解决方案可能是设置客户端
mysql_query('SET CHARACTER SET utf8')
在运行SELECT
查询之前。
更新(2014年6月)
自PHP 5.5.0起,不推荐使用mysql扩展。现在建议使用mysqli。此外,在进一步阅读时 - 应避免使用上述设置客户端集的方法for reasons including security。
我还没有测试过,但这应该是一个不错的替代品:
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
if (!$mysqli->set_charset('utf8')) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
printf("Current character set: %s\n", $mysqli->character_set_name());
}
或使用连接参数:
$conn = mysqli_connect("localhost", "my_user", "my_password", "my_db");
if (!mysqli_set_charset($conn, "utf8")) {
# TODO - Error: Unable to set the character set
exit;
}
答案 1 :(得分:3)
json_encode
似乎正在删除包含无效字符的字符串。您的UTF-8数据可能无法从数据库中以正确的形式到达。
查看您提供的示例,我的猜测是您的数据库 connection 不是UTF-8编码的,而是提供ISO-8859-1字符。
初始化连接后可以尝试SET NAMES utf8;
吗?
答案 2 :(得分:3)
我尝试了这样的代码示例
[~]> cat utf.php
<?php
$arr = array('Coffee', 'Cappuccino', 'Café');
print json_encode($arr);
[~]> php utf.php
["Coffee","Cappuccino","Caf\u00e9"]
[~]>
基于此我会说如果源数据真的是UTF-8,那么json_encode工作得很好。如果不是,那就是你得到null的地方。为什么不这样,我根据这些信息无法分辨。
答案 3 :(得分:1)
在执行json_encode()之前尝试通过此函数发送数组:
<?php
function utf8json($inArray) {
static $depth = 0;
/* our return object */
$newArray = array();
/* safety recursion limit */
$depth ++;
if($depth >= '30') {
return false;
}
/* step through inArray */
foreach($inArray as $key=>$val) {
if(is_array($val)) {
/* recurse on array elements */
$newArray[$key] = utf8json($inArray);
} else {
/* encode string values */
$newArray[$key] = utf8_encode($val);
}
}
/* return utf8 encoded array */
return $newArray;
}
?>
取自对phpnet @ http://php.net/manual/en/function.json-encode.php的评论。
该函数基本上是通过数组元素循环,也许你在数组本身上进行了utf-8编码?
答案 4 :(得分:0)
我对utf8数据进行编码的解决方案是:
$jsonArray = addslashes(json_encode($array, JSON_FORCE_OBJECT|JSON_UNESCAPED_UNICODE))