【问题标题】:PHP output JSON Web Service charset UTF-8 errorPHP 输出 JSON Web 服务字符集 UTF-8 错误
【发布时间】:2013-08-03 06:18:10
【问题描述】:

我正在托管一个由 PHP 输出的 JSON 格式的 Web 服务。

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

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

JSON:

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

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

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

PHP:

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

JSON:

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

但问题仍然存在:

另外,在某些情况下,由于使用 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;

?>

提前感谢您的帮助!

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

【问题讨论】:

  • 你是如何创建你的 json 的?我会执行以下操作:1. 从 db 读取值,2. 使用 utf8_encode 将每个值转换为 utf8,3. 将其放入 php 数组中,最后 4. 执行 json_encode 和 echo
  • @steven 我已经发布了我的 PHP 脚本,看看它。我最初没有编码,只是在输出到 Web 服务时我更改了标题!
  • 设置标题是不够的。您需要 utf8_encoded 字符串。如果您的 db-field 不是 utf8,您可以使用 utf8_encode 获取它们。
  • @steven 我的数据库字段是 utf8_general_ci
  • 这与mysql 有关,但没有关于它的标签。我想很多人最终会在这里寻找:header('Content-Type: application/json');header("Content-type: application/json; charset=utf-8");

标签: php json web-services encoding hebrew


【解决方案1】:

如果你的 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

【讨论】:

  • 你能检查我是否为你的代码添加了 JSON 输出。在名称“x”附近无法在 Android / iphone 中解析?
  • { "tasklist": [ { "customerID": "9936", "name": "×ר ×ר×× ×××× ×××× ×× ××¢\ “×”,“货物”:“××רר”,“目的地”:“××ר”,“数量”:“1.000000”,“开始日期”:“03/01/2013 00:00: 00" } ] }
  • hmmm utf8_encode 的文档说数据应该是 ISO-8859-1 字符串。我不认为你的字符串是这样的。你应该告诉我们你的数据库字段的编码是什么。我会推荐 utf8,在这种情况下,您应该像 @BigToach 所说的那样 SET NAMES 'utf8'。在这种情况下,您不需要使用 php 进行 utf8_encode。希望对您有所帮助。
  • 我的数据库字段是 utf8_general_ci 我什至尝试过 BigToach 方法但仍然是同样的错误..
【解决方案2】:

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

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

SET NAMES 'utf8';

您也可以考虑使用utf8_encode

【讨论】:

  • BigToach mysql_set_charset('utf8');还是同样的问题:(有什么想法吗?
  • 您是否尝试将代码更改为使用 json_encode 而不是自己生成它?
  • 是的.. 我按照另一个答案做了,并将您的代码混合在其中.. 但同样的错误.. JSON 验证错误仅在名称中。
【解决方案3】:

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

也就是说,引号 " 会产生无效的 JSON,但这仅在您使用 json_encode() 并且只希望 PHP 神奇地转义您的引号时才会出现问题。您需要自己进行转义。

也许你可以用\"替换",我想它会解决这个问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多