用于utf8_unicode_ci的JSON数据的PHP头中的内容类型字符集 - Ajax Call

时间:2016-03-19 03:08:38

标签: php mysql angularjs json ajax

我正在使用 utf8_unicode_ci 为MYSQL表中的列存储TAMIL语言字符。

我正在实现一个AngularJS项目,因为我正在调用PHP服务,返回类型是一个JSON数据。我无法获得实际角色,而不是我正在 ?????????

我的PHP示例源代码:

<?php

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

$outp = "";

$sql_select = "";
$sql_select .= "SELECT * FROM poll_quest WHERE qid = $nqid LIMIT 1 ";
$bQuery = mysql_query($sql_select, $link);
while ($bRow = mysql_fetch_array($bQuery)) {

    $qflag = true;

    $outp .= '{ "ID": ' . $bRow['qid'] . ',';
    $outp .= '"Ans":"' . $bRow['ans_tam'] . '" }';
}

$outp ='{"records":['.$outp.']}';
echo($outp);

?>

我的泰米尔语单词

  • மோசம்
  • மோசமாகமோசமாக்லை
  • நன்று
  • மிகமிக்று

MySQL表结构快照:

enter image description here

MySQL表数据快照:

enter image description here

输出JSON数据快照:

enter image description here

{
   "records":[
      {
         "ID":"1",
         "Ans":"??. ????????"
      },
      {
         "ID":"2",
         "Ans":"??. ?????????"
      },
      ........
      {
         "ID":"5",
         "Ans":"??. ??????????"
      }
   ]
}

请帮助我,如何获取Response JSON中的实际字符......

2 个答案:

答案 0 :(得分:1)

首先,MySQL驱动程序即mysql_ *已被弃用,有利于PDO或MySQLi。话虽如此,让我们继续前进。

您的答案需要在连接上设置字符集,即您需要执行以下操作才能使其正常工作 -

<?php
...
$link = mysqli_connect(...);
mysql_set_charset('utf8', $link); // This is your answer
...

为了将来的参考,我重新编写了上面的代码,使用MySQLi来帮助你 -

<?php
// NOTE : I prefer using PDO but I have used mysqli for this example
// NOTE : The following code HAS NOT BEEN TESTED!

header('Content-Type: application/json; charset=UTF-8');

// Connection information
$link = new mysqli($host, $user, $password, $dbname);

$link->set_charset('utf8'); // This is important or mysql_set_charset('utf8', $link) if you insist on using mysql_*

// Check connection
if (mysqli_connect_errno()) {
    printf('Connect failed: %s\n', mysqli_connect_error());

    exit();
}

$outp = '';

// Always use prepared statements!!
if ($stmt = $link->prepare('SELECT qid, ans_tam FROM poll_quest WHERE qid = ? LIMIT 1')) {
    $stmt->bind_param('i', $nqid); // user 's' if this is a string for the first parameter

    $stmt->execute();

    $stmt->bind_result($qid, $ans_tam);

    while ($stmt->fetch()) {
        $qflag = true;

        $outp .= '{ "ID" : ' . $qid . ', "Ans" : "' . $ans_tam . '" }';
    }

    $stmt->close();
}

echo('{"records":[' . $outp . ']}');

答案 1 :(得分:1)

我相信你唯一遗漏的是

mysql_set_charset('utf8');

即使您为表或字段设置了utf8_unicode_ci,与数据库的连接也不一定会自动设置为使用utf8字符编码。

注意:你应该考虑使用utf8mb4_unicode_ci instead of utf_unicode_ci,你应该考虑在数据库(至少是表格)级别而不是字段级别上设置字符集和校对(我看到你有latin1_swedish_ci作为默认值表示整个数据库为latin1_swedish_ci