我有一组通过
JSON传递的关键字(编码的UTF-8),其中一些可能具有é,è,ç等特殊字符.这是用作自动完成器的一部分.例:
array('Coffee','Cappuccino','Café');
我应该补充说,它来自数据库的数组将是:
array('Coffee','Café');
但JSON编码为:
["coffee","cappuccino",null];
如果我通过print_r()打印这些文件,它们会在UTF-8编码的网页上显示出来,但如果要使用print_r($array)查看数组,则使用“café” ;出口();.
如果我在编码JSON之前使用utf8_encode()进行编码,那么它会很好,但在网页上打印的内容是“café”而不是“café”.
也很奇怪,但是json_last_error()被看作是一个未定义的函数,但json_decode()和json_encode()可以正常工作.
关于如何从数据库中获取UTF-8编码数据的任何想法在整个过程中表现相同?
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
原因可能是当前的客户端字符设置.一个简单的解决方案可能是设置客户端
MysqL_query(‘SET CHARACTER SET utf8’)
运行SELECT查询之前.
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_db"); if (!MysqLi_set_charset($conn,"utf8")) { # TODO - Error: Unable to set the character set exit; }