2016-03-19 49 views
1

我使用utf8_unicode_ci爲MYSQL表中的列存儲TAMIL語言字符。PHP中的內容類型字符集UTF8_unicode_ci的JSON數據頭 - Ajax調用

我正在實現一個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":"??. ??????????" 
     } 
    ] 
} 

請幫助我,怎樣才能在響應JSON的實際字符...

+0

如果你只是打印你得到的?我的意思是......使用回聲頭(「Content-Type:text/html; charset = utf-8」); – boctulus

+0

@Boctulus - 參考輸出JSON數據快照,我在瀏覽器中獲得了這個。 –

+0

嘗試在連接到數據庫後使用mysqli_set_charset($ conn,'utf8') – boctulus

回答

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

我相信你錯過的唯一事情是

mysql_set_charset('utf8'); 

即使您已爲表或字段設置utf8_unicode_ci,與數據庫的連接也不一定會自動設置爲使用utf8字符編碼。


注意:您應該考慮使用utf8mb4_unicode_ci instead of utf_unicode_ci,你真的應該考慮設置數據庫(至少表)的卡拉科特集和歸類並不級別字段級別(我看你有沒有latin1_swedish_ci作爲默認說明你的整個數據庫是latin1_swedish_ci

相關問題