Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO查询返回大量\uxxx字符代码,我可以';t转换为unicode字符_Php_Json_Unicode_Utf 8_Pdo - Fatal编程技术网

Php PDO查询返回大量\uxxx字符代码,我可以';t转换为unicode字符

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

我有一个MySQL数据库表,其中以不同的语言存储了国家的名称,但我无法以unicode字符显示数据-我只能在特殊字符所在的位置显示\uxxx代码

查询用于AJAX请求,结果编码为JSON对象

以下是表格(截断):

以下是创建PDO的代码:

$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");