2017-08-02 181 views
1

我正在使用PHP連接到數據庫並檢索大多數字符串。這些字符串是寫在葡萄牙的句子,因此,他們有足夠的「E」,「C」,「U」等......特殊字符PHP UTF8編碼問題

當檢索我這樣做:

$res = sqlsrv_query($conn,$query); 
$array_req = array(); 

while($rs = sqlsrv_fetch_object($res)){ 
    // Get info request 
    $temp_req = array(); 
    $temp_req['id'] = $rs->id; 
    $temp_req['title'] = utf8_decode($rs->title); 
    ... 
} 
echo json_encode(array('result'=>$array_req)); 

而且通過這樣做utf8_decode像「ç」這樣的字符被替換爲「?」例如。如果我沒有進行解碼,那麼文本就可以正常存儲在數據庫中,所以文本是完全正確的。但是,如果我不做解碼,json_encode將檢索字符串爲null

如何保留字符?我已經試過mb_convert_encodinghtmlspecialchars,似乎沒有任何工作。

編輯:此腳本正在被Android應用程序請求。然而,我正在瀏覽器上測試,似乎如果我實際上編碼字符串在UTF8併發送json與JSON_UNESCAPED_UNICODE標誌下面摘下,瀏覽器仍然返回壞字符,但Android應用程序讀取它們正常。去圖... 這是工作代碼:

$res = sqlsrv_query($conn,$query); 
$array_req = array(); 

while($rs = sqlsrv_fetch_object($res)){ 
    // Get info request 
    $temp_req = array(); 
    $temp_req['id'] = $rs->id; 
    $temp_req['title'] = utf8_encode($rs->title); 
    ... 
} 
echo json_encode(array('result'=>$array_req), JSON_UNESCAPED_UNICODE); 
+0

你的DB表使用哪個字符集? – Peter

+0

JSON應該是UTF-8,所以你不需要解碼它。你在哪裏得到NULL – RiggsFolly

+0

看到這個如果你還沒有https://stackoverflow.com/questions/279170/utf-8-all-the-way-through也可以是一個騙局。 –

回答

1

utf8_decode是什麼改變字符轉換爲「?」。你不應該那樣做 - 只是按照原樣使用數據而不進行處理。在json_encode上使用選項JSON_UNESCAPED_UNICODE,它應該工作。

json_encode(array('result'=>$str), JSON_UNESCAPED_UNICODE); 
+0

但是然後json_encode將檢索它們作爲null誰請求該腳本的人。我測試了它... – edwardffs