解決PHP json_encode() MySQL抓取中文字資料顯示空白、問號、null、亂碼問題

7 月 7, 2015 | | 0 條留言

以下有兩種方法分別為mysqli_query與mysql_query連結資料庫的方式,然後使用json_encode()將資料庫轉為json資料格式呈現在網頁上。

MySQL json_encode()中文字空白頁面、問號符號、亂碼

主要嘗試抓取mysql資料碰到的大問題就是中文資料問題,一開始抓取資料,我使用的是自行用架設的XAMPP Server做測試,結果抓取資料時我一次SELECT * 所有的欄位,然後json_edcode(),結果頁面完全沒有任何的東西,空白頁面,測試之後SELECT 其中欄位,只有數值或英文的表單欄位,正常顯示。結果SELECT有中文欄位資料,就發現是空白頁面,大致上可以了解是中文json_encode()時無法出現。

又嘗試一個小實驗,測試一下json_encode()中文的問題,是否可以正常顯示,只是文件上沒有指定為utf8會為無法正常顯示中文,手動將遊覽器編碼為utf8就可以正常顯示。

 '123', 'data' => 'abc'), JSON_NUMERIC_CHECK);
echo json_encode(array('id' => '123', 'data' => '中文', JSON_UNESCAPED_UNICODE);
echo json_encode(array('id' => 123, 'data' => 'abc'));
?>

輸出結果:

{"id":123,"data":"abc"}
{"id":"123","data":"中文"}
{"id":123,"data":"abc"} 

以上結果代表只有抓取MySQL時json_encode()中文會有無法顯示的問題。

我也懷疑自己架設的XAMPP是不是設定哪些功能沒有開啟,而導致這個空白結果,於是又使用自行租用的主機測試了一下,結果 MySQL抓取資料庫json_encode()中文部分有顯示出來,只是所有的值都是“?”問號,在XAMPP是空白任何東西(是完全空白頁面),在這租用的主機上有顯示數值,真是個怪現象。
{googleads center}
後來我在網路上找到了,以下連結mysql json_encode()的程式,標榜能正常顯示中文,果真顯示出來了,但這次不是問號“?”都是為亂碼:


 $value ) {
    $newData[$key] = $value;
    $newData [$key] ['Provincial'] = urlencode ( $value ['Provincial'] );
}
echo urldecode ( json_encode ( $newData ) );
mysql_close ( $con );
?>

輸出結果中文亂碼顯表現如下:

{"a":"u8292u679cu5c0fu7ad9"}

後來將json_encode部分加入JSON_UNESCAPED_UNICODE(不編碼成Unicode),成功正常顯示中文字。(網路教學urldecode ()可以解決編碼的問題,但也不知為什麼在這行不通,只好使用JSON_UNESCAPED_UNICODE PHP 5.4才支援)

以上程式碼其實直接json_encode($respons)就可以,好像下面一行urlencode幾乎沒意義了,我將他改寫為以下方式。

provincial";
//執行SQL語句
$result = mysql_query ( $query );
//循環 將查詢的數據存入數組
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
echo json_encode($response,JSON_UNESCAPED_UNICODE);
mysql_close ( $con );
?>

mysql_query與mysqli_query兩者差別

回頭查詢為什麼這樣的方式,可以成功讀取MySQL然後使用 json_encode()的中文資料出來,後來有比對與我之前用的程式碼有不同的地方,他是使用mysql_query而我之前用的是mysqli_query,兩者之間有什麼差別,我也搞不清楚,查詢了一下。

功用性有什麼差別我這就不多說了,但重點在這兩者之間連結資料庫的方式有所不同。

想了解兩者連結資料庫的寫法差異可連結以下網址比較:

mysql:http://php.net/manual/en/function.mysql-select-db.php
mysqli:http://php.net/manual/en/mysqli.select-db.php

然而mysql使這個正常讀取中文資料的程式,我將程式的mysql_query ("set names utf8" );,這短註解掉執行看看,發現用mysql這個原先正常可顯示中文的程式,中文部分也變成問號符號,在XAMPP主機也成為空白頁面,這讓我對mysqli這個程式,是否也是因為set names utf8的原因,手動加入mysqli這支程式mysql_query ("set names utf8" ),卻沒有動作,一樣的同樣是問號的符號。
{googleads center}
知道mysql與mysqli兩者連結的寫法有所不同,然而set names utf8也有所不同,怪不得設了等於沒有設,正確mysqli需要這樣寫

$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link)); 
mysqli_query($link,"set names utf8");

這樣終於是了解其中的問題。以下為mysqli連結mysql json_encode()程式方法

註:Windows 下的XAMPP 使用mysqli還是無法取得中文資料,一樣的空白頁面。也不知道是什麼原因。

使用PHP產生的MySQL JSON轉換到 JSON檔 

如過想產生一個.json的檔案可以用下的方法。(只需要先有個.json檔,再將檔案寫入至這個檔案)