PHP输出JSON Web Service charset UTF-8错误

时间:2013-08-02 04:59:10

标签: php json web-services encoding hebrew

我正在通过PHP托管JSON输出的Web服务。

我在数据库中有希伯来语数据集,我将此作为输出发布到Web服务。

当我最初发布数据时,它输出结果如下:

JSON:

{
    "tasklist": [
        {
            "customerID": "9936",
            "name": "טר ×רמה ×™×–×•× ×•×‘×™× ×•×™ בע"מ",
            "cargo":"×ברר",
            "destination":"מכר", 
            "quantity":"1.000000",
            "startdate":"03/01/201300: 00: 00" 
        }
               ]
}

但是这个"×ברר"可以被Android / Iphone解析器读取并将其转换为原始希伯来语。但我在"name": "טר ×רמה ×™×–×•× ×•×‘×™× ×•×™ בע"מ",面临错误。其中"位于字符串之间,因此JSON无效并显示错误!

enter image description here

要解决此问题,我使用UTF-8将此"×ברר"转换为希伯来语"נברר"。但在这种情况下,问题仍然存在:

PHP:

  

标题('Content-type:text / html; charset = UTF-8');

JSON:

{
    "tasklist": [
        {
            "customerID": "9936",
            "name": "טר ארמה יזום ובינוי בע"מ",
            "cargo":"נברר",
            "destination":"מכר",
            "quantity":"1.000000",
            "startdate":"03/01/201300: 00: 00"
        }
                ]
}

但问题仍然存在:

enter image description here

在某些情况下,由于使用了UTF-8

,我得到了这个
"name":"מחצבות כפר גלעדי-חומרי מ�"
  • 我如何克服这个问题?
  • 我需要使用其他特定编码吗?

注意:数据不能在数据库中更改解决方案应该在输出到JSON时。

DB中存储的数据如何显示如下:

  

名称

     

×ž× - ×|×'ות×>פר×'עדי - × - ומרימ×

我输出JSON的PHP脚本:

<?php

//My DB connection and Query comes here

$jsontext = '{"tasklist":[';
while($row = mysql_fetch_array($queryExe)){
$jsontext .= '{"customerID":"'.$row['AUTO_ID'].'",';
$jsontext .='"name":"'.$row['Customer_Name'].'",';
$jsontext .='"cargo":"'.$row['Type_of_Cargo'].'",';
$jsontext .='"destination":"'.$row['Destination'].'",';
$jsontext .='"quantity":"'.$row['Quantity'].'",';
$jsontext .='"startdate":"'.$row['startdate'].'"},';
}
$jsontext = substr_replace($jsontext, '', -1); // to get rid of extra comma
$jsontext .= "]}";

header('Content-type: text/html; charset=UTF-8');

//Output the final JSON
echo $jsontext;

?>

提前感谢您的帮助!

问题清楚了吗?了解我的问题。

3 个答案:

答案 0 :(得分:15)

如果你的db-field是utf8,你应该坚持:

mysql_query("SET NAMES 'utf8'");

在插入数据之前,您应该始终执行'SET NAMES ...'。 确保你真的存储了utf8编码的字符串!

然后进行查询:

mysql_query($your_query);

$array = array("tasklist"=>array());    

while($row = mysql_fetch_array($queryExe)){
        $a = array();
        $a["customerID"] = $row['AUTO_ID'];
        $a["name"] = $row['Customer_Name'];
        $a["cargo"] = $row['Type_of_Cargo'];
        $a["destination"] = $row['Destination'];
        $a["quantity"] = $row['Quantity'];
        $a["startdate"] = $row['startdate'];
        $array["tasklist"][] = $a;
}

header("Content-type: application/json; charset=utf-8");

echo json_encode($array);
exit();

我的经验是,当服务器默认字符集是iso时,这些还不够。在这种情况下,我需要在我的.htaccess中执行以下操作:

AddDefaultCharset utf-8

答案 1 :(得分:1)

您应该更改代码以使用json_encode。您需要正确传递utf8编码数据。

如果您使用的是MySQL,可以在查询之前尝试运行以下内容以获取数据。

SET NAMES 'utf8';

您还可以查看使用utf8_encode

答案 2 :(得分:1)

来自http://www.php.net/manual/en/function.json-encode.php#100565

  

那就是说,引用“会产生无效的JSON,但这只是一个问题,如果你正在使用json_encode()并且只是期望PHP神奇地逃脱你的引号。你需要自己逃避。

您可以将"替换为\",我猜它会解决问题。

来源:PHP JSON String, escape Double Quotes for JS output