Php PDO查询返回大量\uxxx字符代码,我可以';t转换为unicode字符
我有一个MySQL数据库表,其中以不同的语言存储了国家的名称,但我无法以unicode字符显示数据-我只能在特殊字符所在的位置显示\uxxx代码 查询用于AJAX请求,结果编码为JSON对象 以下是表格(截断): 以下是创建PDO的代码:Php PDO查询返回大量\uxxx字符代码,我可以';t转换为unicode字符,php,json,unicode,utf-8,pdo,Php,Json,Unicode,Utf 8,Pdo,我有一个MySQL数据库表,其中以不同的语言存储了国家的名称,但我无法以unicode字符显示数据-我只能在特殊字符所在的位置显示\uxxx代码 查询用于AJAX请求,结果编码为JSON对象 以下是表格(截断): 以下是创建PDO的代码: $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET N
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",
$dbuser,
$dbpass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
$return_arr = array ();
if ($conn) {
$ac_term = $_GET['term'];
$query = "SELECT * FROM `tbl_countries` WHERE `country_en` LIKE :term";
$result = $conn->prepare ($query);
$result->bindValue (":term", "%".$ac_term."%");
$result->execute ();
/* Retrieve and store in array the results of the query.*/
while ($row = $result->fetch (PDO::FETCH_ASSOC)) {
$row_array['country_en'] = $row['country_en'];
$row_array['country_de'] = $row['country_de'];
$row_array['country_es'] = $row['country_es'];
$row_array['country_fr'] = $row['country_fr'];
$row_array['country_ru'] = $row['country_ru'];
$row_array['country_tr'] = $row['country_tr'];
$row_array['country_ar'] = $row['country_ar'];
$row_array['ccode'] = $row['ccode'];
array_push ($return_arr, $row_array);
}
}
unset ($conn);
echo json_encode ($return_arr);
PHP脚本的开头是以下行:
header('Content-Type: text/html; charset=utf-8');
这是输入搜索词united%20king
时得到的典型输出:
[{
"country_en":"United Kingdom",
"country_de":"Vereinigtes K\u00f6nigreich",
"country_es":"Reino Unido",
"country_fr":"Royaume-Uni",
"country_ru":"\u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u044f",
"country_tr":"Birle\u015fik Krall\u0131k",
"country_ar":"\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629",
"ccode":"GB"
}]
在PHP代码中,我尝试使用htmlentities
,但它只显示德语输出的特殊字符:
$row_array['country_de'] = htmlentities ($row['country_de'], ENT_QUOTES, "UTF-8");
我错过了什么?感谢阅读。这不是PDO,而是json_编码的常规行为。在现代PHP版本中,您可以将其关闭,但无论如何都不会有问题 我不知道您为什么要回显原始json,但通常不打算直接回显到HTML中,而是由一些JS代码使用。JS可以对这种编码进行分类。但是,为了减少数据量,因为可以使用5.4
JSON\u UNESCAPED\u UNICODE
标志
另外,我建议您在提问之前稍微调试一下代码。如果要检查PDO的输出,请针对PDO而不是json进行检查。验证程序执行的每个步骤,以找到破坏数据的步骤。这是完全有效的JSON;这些转义序列是编码非ASCII字符的常规JSON方式。如果您在客户端上使用常规JSON解码器对其进行解码,您将得到正确的字符。听起来像是在拉丁1页上读取UTF8数据。仔细检查HTML或json页面发送的标题。请参阅。如果您的默认编码不是utf8,也可以尝试运行
SET CHARSET'utf8'
。我使用的是header('Content-Type:text/html;CHARSET=utf-8')代码>在PHP文件的开头设置字符集。感谢链接和建议谢谢建议-显然是我的理解不足导致了这一点,而且[错误]将示例/教程中的内容散列在一起。你完全正确-现在看来很明显我应该这样做。我必须提到,JS将正确处理这些符号感谢您的解释-我将研究解码,或者完全去掉JSON部分。
$row_array['country_de'] = htmlentities ($row['country_de'], ENT_QUOTES, "UTF-8");