对象中的特殊字符会导致json_encode抛出错误

时间:2012-02-14 17:34:29

标签: php mysql character-encoding pdo json

所有人都欢呼知识的守护者,这个愚蠢的问题可能会让你身体健康,

我已经着手学习PHP,作为这项光荣事业的一部分,我正在尝试为MySql DB创建一个RESTful API。我在PHP 5.3上使用Slim。到现在为止还挺好。但我也住在丹麦,这是一个问题(显然),因为我们喜欢使用像'æ','ø'和'å'这样的字符。

所以,当我向一个没有奇怪字符的对象询问我梦幻般的RESTful装置时,它礼貌地回复:

{
id: "3",
name: "Wall - Plaster",
price: "200",
unit: "m2",
tags: "1"
}

但是,唉。当要求返回带有'æ'或任何其他奇怪字符的对象时,事情就不那么顺利了:

FOOL! json_encode(): Invalid UTF-8 sequence in argument

utf8_encode()和Iconv.conv()适用于字符串和数组。但是我可以将什么用于物体?有没有什么方法可以迭代我的方式通过一个对象,比如foreach?

我的数据库和表都是UTF8。

我的排外功能:

function getItem($id) {
        $sql = "SELECT * FROM items WHERE id=:id";
        try {
                $db = getConnection();
                $stmt = $db->prepare($sql);
                $stmt->bindParam("id", $id);
                $stmt->execute();
                $item = $stmt->fetchObject();
                $db = null;
                echo json_encode($item);
                //echo $item;
                //print_r($item);
            } catch(PDOException $e) {
                echo '{"error":{"text":'. $e->getMessage() .'}}';
            }
    }    

谢谢你,也许处女们带着发酵大麦的礼物涌向你。

1 个答案:

答案 0 :(得分:2)

您的数据库连接可能是ISO-8859-1 - 它是mySQL连接的默认编码。因此,即使数据库是UTF-8,您也会获得ISO-8859-1字符数据。

有关更改PDO连接字符集的各种(永久和每个连接)方法,请参阅this question