DATAtourisme

Problème d'encodage des caractères

Bonjour

J’ai écrit un petit programme de test qui malheureusement me retourne des caractères encodés sous la forme 00e9 (Unicodes)

Le Camping du Perche est situ\u00e9 au coeur du Parc naturel r\u00e9gional du Perche

Est-ce qu’il y a un paramètre au niveau de l’API qui permet d’éviter cela ?

Apparemment oui puisque l’extrait qui m’est fourni n’a pas ce problème.
Il est donc probable que je m’y prenne mal. Merci pour votre aide.

Voici le résultat :

{ "data": { "poi": { "total": 171, "results": [ { "rdfs_label": [ "Camping du Perche" ], "rdfs_comment": [ "Faites le plein de nature et de loisirs ! Le Camping du Perche est situ\u00e9 au coeur du Parc naturel r\u00e9gional du Perche et en la lisi\u00e8re de la for\u00eat domaniale de Senonches." ], "_uri": "https:\/\/data.datatourisme.fr\/15\/025ac8d6-0e9d-380f-ad01-9800544bfbbd", "dc_identifier": [ "HPACEN0280060016" ], "isLocatedAt": [ { "schema_geo": [ { "schema_latitude": [ 48.5130947 ], "schema_longitude": [ 1.019561 ] } ] } ] } ] } } }

et voici le programme (volontairement limité à la première occurrence) :

<?php

// composer autoload

require __DIR__ . '/api-datatourisme/vendor/autoload.php';

// instanciation du client

$api = \Datatourisme\Api\DatatourismeApi::create('http://localhost:9999/blazegraph/namespace/kb/sparql');

// éxecution d'une requête

$results = $api->process('{

  poi (

  size: 1

  filters: [

  { rdf_type: {_eq: "https://www.datatourisme.fr/ontology/core#Camping"} }

  ]

  )

  {

    total

    results {

    rdfs_label

    rdfs_comment

      _uri                  # <- Identifiant du POI

      dc_identifier         # <- Référence du POI

      isLocatedAt {

        schema_geo {

          schema_latitude   # <- Latitude du POI

          schema_longitude  # <- Longitude du POI

        }

      }

    }

  }

}');

// prévisualisation des résultats

echo json_encode($results, JSON_PRETTY_PRINT);

Pour contourner ce problème voici ce que je suis obligé de faire en php avant insertion dans une base de donnée :

                $descr = isset($res[$i]['rdfs_comment'][0]) ? $conn->quote($res[$i]['rdfs_comment'][0]) : "NULL";
                $descr = html_entity_decode(preg_replace('/\\\\u([\da-fA-F]{4})/', '&#x\1;', $descr));	// correction erreur encodage datatourisme

Comme cela ne me parait pas vraiment normal d’avoir à faire cela, j’en déduis que je n’utilise pas l’API correctement. Ce n’estt pourtant pas faute d’avoir lu et relu la doc de l’API.

Bonjour,

Dans votre script, l’encodage unicode est l’oeuvre de la fonction json_encode. Si vous observez le contenu de la variable $results, vous remarquerez que les caractères sont correctement représentés.

Pour empêcher json_encode d’encoder en Unicode (ce qui donne un json parfaitement valide), vous pouvez utiliser le flag JSON_UNESCAPED_UNICODE :

echo json_encode($results, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

Cordialement

1 « J'aime »

Merci pour ce retour. Le problème était de mon côté. Le problème d’encodage était moins sur le contenu de la variable que sur le stockage en base de données (cf copie d’écran ci-dessous) mais il ne venait pas de l’API mais d’une mauvaise initialisation de la connexion PDO.
Moralité : ne jamais oublier de spécifier le charset lors de l’initialisation PDO :
$conn = new PDO("mysql:host=$servername;dbname=$database;charset=UTF8", $username, $password);
Si cela peut servir à d’autres voici le résultat selon qu’on spécifie ou non le charset UTF8.

1 « J'aime »