【问题标题】:unknown character / unknown token, json string未知字符/未知标记,json字符串
【发布时间】:2013-06-06 14:45:48
【问题描述】:

这很简单。一方面我有一个 PHP 文件,另一方面我有一个带有 javascript 脚本的 html 页面来获取 json 字符串并对其进行处理。

我确保我的所有文件都是 UTF-8,我的数据库也是。

第一次测试(它有效):(PHP)

$array['fname'] = 'bob';
$array['lname'] = 'mozz';
$array['age'] = 20;
$array['email'] = 'test@test.com';
echo json_encode($array);

第二次测试(失败)(PHP)

try{
    $sql = 'SELECT * FROM blablabla';
    $results = $pdo->query($sql);

    $array = array();
    while($row = $results->fetch()){
        $array[] = array(
                'id' => $row['id'],
                'fname' => $row['fname'],
                'lname' => $row['lname'],
                'gender' => $row['gender'],
                'organization' => $row['organization'],
                'phoneLine1Label' => $row['phoneLine1Label'],
                'phoneLine1' => $row['phoneLine1'],
                'phoneLine1Ext' => $row['phoneLine1Ext'],
                'phoneLine2Label' => $row['phoneLine2Label'],
                'phoneLine2' => $row['phoneLine2'],
                'phoneLine2Ext' => $row['phoneLine2Ext'],
                'cellPhoneLabel' => $row['cellPhoneLabel'],
                'cellPhone' => $row['cellPhone'],
                'email' => $row['email']
        );
    }
    $json = json_encode($array);
    echo $json;
}catch(PDOException $e){}

我尝试将结果转换为十六进制以查看未知字符是什么:

  • 当我直接从脚本打印时,我没有发现任何错误(没有特殊字符)
  • 当我在控制台中打印结果时,它看起来很棒,但是
  • 当我将结果复制到剪贴板并将其粘贴到 utf8 文件中时,非常棒
  • 当我将结果复制到 ansi 文件中时,我看到一个“?”在它的开始
  • 当我从控制台(在谷歌浏览器中)右键单击时,谷歌会在字符串的开头看到一个正方形(眼睛看不见)

在我的 javascript 中我有;

<script>
    $(document).ready(function(){
        var query = {
            q: 'test',
            apikey: '1234567890'
        };
        $.post('script.php',query,function(data,status){
            switch(status){
                case 'success':
                    obj = JSON && JSON.parse(data) || $.parseJSON(data);
                    console.log(obj);
                break;
            }
        });
    });
</script>

当我从我的第一个 PHP 示例插入脚本时,它可以工作,但不能从我的第二个示例中插入。它给我一个错误,说明我的 json 有未知令牌。

我对所有内容进行了三次检查,但我只是不知道它可能是什么。

编辑

这是来自 Fiddler 网络调试器的捕获,只是更奇怪:

编辑 2 我什至使用了像这样的修剪:

$json = json_encode($rows);
$fix = substr($json,7);
$fix = '[{"id":'.$fix;

但是当我收到它时它仍然添加并且未知字符添加开头。

编辑 3(解决方案) 我清空文件,将其保存为不带 BOM 的 utf8 并粘贴回内容,它就完成了这项工作。我仍然不明白它为什么这样做。我确实了解 BOM 创建问题,但包含我的 PHP 的文件是一个包含其他指令的控制器,而那些严重基于编码的指令运行良好。非常感谢任何人花时间研究我的问题,我真的很感激!

【问题讨论】:

  • 您是否尝试过在您的阵列上使用trim,然后再使用json_encode 呢?例如json_encode(array_map('trim',$array));
  • 你能复制/粘贴服务器响应吗?
  • @ManseUK 我试过了,没有成功
  • 你确定你的php开始标签前没有空格什么的吗?
  • @Brewal 是的,从头开始重写了好几次

标签: php mysql ajax json encoding


【解决方案1】:

这闻起来就像你在前面有一个 BOM。保存没有 BOM 的 PHP 文件,应该这样做。 :)

另请参阅:UTF-8 BOM signature in PHP files

【讨论】:

    【解决方案2】:

    我清空文件,将其保存为不带 BOM 的 utf8 并粘贴回内容,它就完成了这项工作。我仍然不明白它为什么这样做。我确实了解 BOM 创建问题,但包含我的 PHP 的文件是一个包含其他指令的控制器,而那些严重基于编码的指令运行良好。非常感谢任何人花时间研究我的问题,我真的很感激!

    【讨论】:

    • 查看我的回答中的链接。 PHP 会一直输出到浏览器,只需要加载控制器文件(include/require)。
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2013-08-22
    • 2013-01-13
    • 1970-01-01
    • 2013-07-25
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多