php – UTF-8中的值在JSON中被编码为NULL
我有一组通过
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编码数据的任何想法在整个过程中表现相同? 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; } 更多更新: echo json_encode( array("Caf??") ); // ["Cafu00e9"] echo json_encode( array("Café") ); // null
原因可能是当前的客户端字符设置.一个简单的解决方案可能是设置客户端
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: %sn",$mysqli->error); } else { printf("Current character set: %sn",$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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |