Php修改从数据库中检索的值(编码和特殊字符问题)

时间:2017-08-23 10:28:26

标签: php android mysql character-encoding

虽然我找到了类似于这个问题的答案,但我仍然无法解决以下问题: 我有一个使用utf8编码的数据库,创建了我的手段

    CREATE TABLE report (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    description TEXT,
    image MEDIUMTEXT,
    [...]
    ) DEFAULT CHARACTER SET utf8

我已成功从我的Android应用程序上传了一些条目。特别是,图像由字符串编码(编码/解码编码工作,所以我不会再回过头来);然而,当我的android应用程序联系服务器(执行php脚本)以检索描述和图像时,在“描述”中存在特殊字符(如'è')的问题,而编码图像的字符串返回到android应用程序在每个特殊字符(例如'/')前面都填充了转义字符('\'),因此返回的字符串与发送的字符串不同,并且无法从损坏的字符串中检索图像。

我要执行的查询(此处'id'字段已修复用于调试目的)如下所示,并且在phpMyAdmin上它可以正常工作

SELECT description, image FROM report WHERE id=8 

我认为问题出在php脚本中,如下所示(我只会粘贴相关部分)

<?php
    header('Content-Type: application/json');
    $action = $_POST['action'];
    try {
        $pdo = new PDO('mysql:host=activecitizen.altervista.org;dbname=my_activecitizen', 'activecitizen', '');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->exec('SET NAMES "utf8"');
    }
    catch (PDOException $e) {
        [...]
    }
switch($action){
        [...]
        break;
    case "get_report_details":
        $report_id = $_POST['report_id'];
        $report_id_int = (int)$report_id;
        try{
            $sql = 'SELECT description, image FROM report WHERE id = '.$report_id_int;
            $result = $pdo->query($sql);
            $row = $result->fetch();

            $output .= $row['description'];
            $output .= "~";
            $output .= $row['image'];

            echo json_encode($output);
            exit();
        }
        catch (PDOException $e){
            [...]
        }
        break;
}
?>

我认为$ pdo-&gt; exec('SET NAMES“utf8”');线条足以解决编纂问题,但似乎并非如此。

这是返回到Android应用程序的字符串的预览:

"qui c'\u00e8 qualcuno che non ha voglia di rifarsi il letto!~iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U\/gAA[...]"

在这里你可以看到“c'\ u00e8”被归为“c'è”和 iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U / gAA而不是 iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U / GAA as(在字符串的第一个小部分)由phpmyadmin执行的查询返回。

我很抱歉这个长期的问题,并提前感谢任何愿意提供帮助的人。

1 个答案:

答案 0 :(得分:1)

json_encode()将多字节unicode字符编码为\uXXXX。如果您不想要,可以使用JSON_UNESCAPED_UNICODE选项,如下所示:

echo json_encode($output, JSON_UNESCAPED_UNICODE);

请参阅json_encode()JSON constants

上的文档