簡體   English   中英

PHP修改從數據庫檢索的值(編碼和特殊字符問題)

[英]Php modifies values retrieved from database (codification and special characters issues)

盡管我找到了類似問題的答案,但仍然無法解決以下問題:我有一個使用utf8編碼的數據庫,

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

我已經從我的android應用程序成功上傳了一些條目。 特別是,圖像是由字符串編碼的(編碼/未編碼有效,因此我不再贅述); 但是,當我的android應用程序與服務器(執行php腳本)聯系以獲取描述和圖像時,“描述”中的特殊字符(例如“è”)存在問題,而將圖像編碼的字符串返回給android應用程序在每個特殊字符(例如'/')之前都用轉義字符('\\')填充,因此返回的String與發送的String不同,因此無法從損壞的String中檢索圖像。

我將要執行的查詢(此處的“ 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-> exec('SET NAMES“ utf8”'); 行足以解決編碼問題,但事實並非如此。

這是返回到android應用程序的字符串的預覽:

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

在這里您可以看到,返回的“ c'\\ u00e8”是由“c'è”插入的,並且iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U / gAA代替了iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABNs的第一個執行過的字符串(第一個)。

對於這個漫長的問題,我們深表歉意,在此先感謝您誰願意提供幫助。

json_encode()將多字節unicode字符編碼為\\uXXXX 如果您不希望這樣,可以使用JSON_UNESCAPED_UNICODE選項,如下所示:

echo json_encode($output, JSON_UNESCAPED_UNICODE);

請參閱有關json_encode()JSON常量的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM