Json编码为某些字符返回null值

时间:2013-07-09 17:51:57

标签: php mysql json unicode

我写了一个简单的php文件(使用GET方法调用),它返回一个json文件。代码如下:

$q=$_GET["q"];

$query = "SELECT name, surname, data, session from users where id= ?";
      $stmt = $connectiondb->prepare($query);
      $stmt->bind_param('i', $id);
      $id= $q;
      $stmt->execute();
      $stmt->bind_result($name,$surname,$data,$session);
      $stmt->fetch();
      $stmt->close();

      $array = array("name" => $name, "surname" => $surname,"data" => $data, "session" => $session); 
      echo json_encode($array);

我的数据库(mySql)表中的字段“session”以这种方式定义:

Type : text
Collation: utf8_general_ci

我尝试启动脚本,从“users”表中选择一行,其中session的值为"last session",结果如下:

{"name":"John","surname":"Mayer","date":"2013-01-01","session":"last session"}

这很好。但是当我的表中的归档会话具有值"1° session"时,脚本会生成以下输出:

{"name":"Mike","surname":"Stern","date":"2013-04-02","session":null}

(因为你可以在json输出中使用sea session为空)

我认为问题是由角色°生成的。我该如何解决这个问题?

修改

我尝试添加以下代码行php:

$session = utf8_decode($session);

我得到了这个:

{"name":"Mike","surname":"Stern","date":"2013-04-02","session":"1? session"}

我不再是null值,但°被翻译成?个字符。

1 个答案:

答案 0 :(得分:1)

正如this post

中所述

我添加这一行:

$connectiondb->set_charset('utf8');

结果如下:

{"name":"Mike","surname":"Stern","date":"2013-04-02","session":"1\u00b0 session"}

这似乎是一个问题,因为我想要°而不是相对的UTF8代码。

但是,由于php文件是从ajax调用的,我只是设置了

scriptCharset: "utf-8"

现在我可以引用data.session并获取"1° session"