2017-08-23 1 views
0

Bien que j'aie trouvé des réponses à des questions similaires, je ne suis toujours pas capable de résoudre le problème suivant: J'ai une base de données utilisant la codification utf8 , créé mes moyens dePhp modifie les valeurs récupérées de la base de données (problèmes de codification et de caractères spéciaux)

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

J'ai réussi à télécharger une entrée de mon application android. En particulier, l'image est codifiée par une chaîne (les travaux de codage/décodage, donc je ne reviendrai pas là-dessus); cependant, quand mon application android contacte le serveur (exécutant un script php) pour récupérer la description et l'image, dans la description il y a un problème avec les caractères spéciaux (comme 'è'), tandis que la chaîne codant l'image retourne à l'application android est rempli avec le caractère d'échappement ('\') devant chaque caractère spécial (par exemple '/'), donc la chaîne renvoyée est différente de celle envoyée et il n'est pas possible de récupérer l'image de la chaîne corrompue.

La requête que je vais exécuter (ici le champ « id » est fixé pour débouguer) est le suivant, et sur phpMyAdmin il fonctionne très bien

SELECT description, image FROM report WHERE id=8 

Je suppose que le problème réside dans le php script, qui est la suivante (je vais coller uniquement la partie pertinente)

<?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; 
} 
?> 

Je pensais que PDO- $> exec ('NOMS SET "UTF8"'); ligne était suffisante pour résoudre le problème de la codification, mais cela ne semble pas être le cas.

Ceci est un aperçu de la chaîne retournée à l'application Android:

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

Ici vous pouvez voir que « c '\ u00e8" est retourné insted de "c'è" et iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U/GAA au lieu de iVBORw0KGgoAAAANSUhEUgAAAUwAAAC6CAIAAABKsOO4AAAAA3NCSVQICAjb4U/gAA as (le premier petit morceau de la chaîne) renvoyé par la requête effectuée sur phpmyadmin.

Je suis désolé pour la longue question, et je vous remercie d'avance pour tous ceux qui veulent aider.

Répondre

1

json_encode() code les caractères unicode multioctets comme \uXXXX. Si vous ne voulez pas que vous pouvez utiliser l'option JSON_UNESCAPED_UNICODE comme ceci:

echo json_encode($output, JSON_UNESCAPED_UNICODE); 

Voir la documentation sur json_encode() et JSON constants

+0

Merci, vous répondez m'a amené à connaître un peu plus abount JSON. Le vrai problème était que j'ai essayé d'utiliser JSON sans en savoir assez à ce sujet. Je pensais pouvoir travailler avec la chaîne produite par le code php echo json_encode(), après avoir supprimé les caractères d'échappement, etc. A partir du lien que vous avez posté, j'ai appris que je devais d'abord décoder la chaîne json. Là où quelques problèmes supplémentaires avec le format de chaîne décodé (il devait être sous la forme {nom: valeur}), mais maintenant toute la procédure fonctionne parfaitement. Merci :) PS .: devrais-je être celui qui mettra le tag [RESOLU] dans le titre? – alkasel

+0

@alkasel - cliquez sur la coche de la réponse. –