bonjour à tous,

voilà je me sui trouver confronter à un classique du php avec la fonctione json_encode

lorsque je voulais encoder en JSON une chaine de caractére avec des accents, je me retouvé avec des choses bizares.

{"Time":1449474797000,"Lat":"[08:31:53","Lng":"113.90249","Status":"D\u00e9barquement","Speed":"0","Heading":"76","Altitude":"32","Distance":"6732.9506265181","FuelUsed":"12","Temps_restant":"00:00"}

ayant fait le tour de forum j'ai vue beaucoup de chose sans jamais réellement comprendre mais j'ai trouvé une fonction qui corrige le soucis, tout du moins à l'affichage (pas tester sur BD).

https://benjion.wordpress.com/2013/01/03/php-json_encode-et-probleme-avec-les-accents/

$monTableau = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($monTableau));

Mais j'ai peur de foutre en vrac des données

voici la config du systéme

<!DOCTYPE html>
<html lang="fr">
    <head>
        <title>mon site</title>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">

la bd sur phpmyadmin (voir message log)

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `tks2_blackbox` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pilotid` varchar(11) NOT NULL DEFAULT '0',
  `flightnum` varchar(30) NOT NULL DEFAULT '0',
  `aircraft` varchar(12) NOT NULL DEFAULT '',
  `depicao` varchar(4) NOT NULL DEFAULT '',
  `depapt` varchar(255) NOT NULL DEFAULT '',
  `arricao` varchar(4) NOT NULL DEFAULT '',
  `arrapt` text NOT NULL,
  `messagelog` longtext NOT NULL,
  `lastupdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `client` varchar(20) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `pilotid` (`pilotid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=75 ;

objet pdo

$pdo = new PDO($this->dbase_dns,$this->dbase_user , $this->dbase_pass, 
                array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

j'ai pas regardé l'encodage de mes fichiers php, mais normalement ils sont en en utf8 sans boom.

donc je si je prend le contenu de ma bd (colone message log) ,
sortie affichage phpmyadmin

*![Time UTC]2015-12-07 08:32:17![lat]22.32483![lng]114.19332![status]Embarquement![speed]0![heading]136![altitude]4![distance]6748.7700408981![fuelUsed]0![temps_restant]00:00*![Time UTC]2015-12-07 08:32:47![lat]22.32162![lng]114.19682![status]Décollage![speed]66![heading]135![altitude]54![distance]6748.9943373064![fuelUsed]0![temps_restant]102:15![log][08:31:53] ...

et que je l'encode en json, j'ai ceci

{"Time":1449473537000,"Lat":"22.32483","Lng":"114.19332","Status":"Embarquement","Speed":"0","Heading":"136","Altitude":"4","Distance":"6748.7700408981","FuelUsed":"0","Temps_restant":"00:00"}
{"Time":1449473567000,"Lat":"22.32162","Lng":"114.19682","Status":"D\u00e9collage","Speed":"66","Heading":"135","Altitude":"54","Distance":"6748.9943373064","FuelUsed":"0","Temps_restant":"102:15"}
{"Time":1449473597000,"Lat":"22.31311","Lng":"114.20559","Status":"En mission","Speed":"95","Heading":"141","Altitude":"404","Distance":"6749.5611016503","FuelUsed":"1","Temps_restant":"71:03"}

J'arrive donc à me poser 2 questions, enfin 3

-quelle étapes de mon coté aurai je pu louper

-es ce que la parade sité plus haut est valable et sur pour récrire ma bd en réencoder mes string explode en json

-aurai t'il laisser une fonction chez php boiteuse.

Pourriez vous éclairer ma bougie.

Merci d'avance

Flo

2 réponses


flo3376
Auteur

nobody sur ce coup?

$array = array('nome'=>'Paição','cidade'=>'São Paulo');

$array = array_map('htmlentities',$array);

//encode
$json = html_entity_decode(json_encode($array));

//Output: {"nome":"Paição","cidade":"São Paulo"}
echo $json;

Ou ça ?

function utf8_encode_all($dat) // -- It returns $dat encoded to UTF8
{
  if (is_string($dat)) return utf8_encode($dat);
  if (!is_array($dat)) return $dat;
  $ret = array();
  foreach($dat as $i=>$d) $ret[$i] = utf8_encode_all($d);
  return $ret;
}
/* ....... */

function utf8_decode_all($dat) // -- It returns $dat decoded from UTF8
{
  if (is_string($dat)) return utf8_decode($dat);
  if (!is_array($dat)) return $dat;
  $ret = array();
  foreach($dat as $i=>$d) $ret[$i] = utf8_decode_all($d);
  return $ret;
} 

Ou encore ça ?

    $data = 'éáíúűóüöäÍÓ';
    $json = json_encode( utf8_encode($data) );

    // [..]

    $data = utf8_decode( json_decode($json) );