Bonjour,
Je suis sur la réalisation d'un système pour remplir facilement une base de donnée (qui fonctionne très bien) et qui utilise en parallèle pour simplifier la tâche Jquery Autocomplete
Tout le site est encodé en UTF8, aussi bien l'entête HTML, la base de donnée et les requêtes PDO sont en UTF8

Mais quand j'utilise l'autocomplete de JQuery, là je me retrouve avec une incompréhension des accents, la clause WHERE différencie les "e" et "é" et le json_encode me renvoi des choses comme "é"

Je ne vois pas d'ou cela peut provenir, je m'arrache les cheveux...
Dans la base de donnée, il m'affiche effectivement les caractères de la même façon.

Voici le script de requête en cause:

//header('Content-Type: text/html; charset=UTF-8');
require_once("secure/cnxMySQL.php");

if (isset($_GET['term'])){
    $return_arr = array();

    $sql = $cnx->prepare("SELECT id, firstname, lastname FROM workers 
        WHERE CONCAT(firstname,lastname) LIKE :term ");
    $sql->execute(array('term' => '%'.$_GET['term'].'%'));
    while($d = $sql->fetch(PDO::FETCH_ASSOC)){
        $return_arr[]  = array(
            'label' => $d['firstname']." ".$d['lastname'],
            'value' => $d['id']);
    }

    echo json_encode($return_arr,true);
}

J'ai tenté de forcé l'entête de ma page de requête MySQL en UTF8 mais rien n'y fait. J'ai également testé une solution que j'ai pu trouver sur internet mais qui résoud partiellement mon problème:

echo html_entity_decode(json_encode($return_arr),ENT_COMPAT,'UTF-8');

Le résultat est que j'ai bien le renvoie avec les caractères accentué, mais au niveau de la recherche, les caractères accentué sont ignoré.

12 réponses


antho07
Réponse acceptée

Bonjour,

Si je comprends bien, le problème est également dans la base? les caractères accentués sont cassés?

tekyo11
Auteur
Réponse acceptée

Finalement histoire terminé enfin !

J'ai suivi entièrement ce petit "tuto" pour palier aux problèmes de l'UTF-8 et j'ai fini par y arriver.

Apache configuration (in httpd.conf or .htaccess)

  • AddDefaultCharset utf-8

PHP (in php.ini)

  • default_charset = "utf-8"
  • mbstring.internal_encoding=utf-8
  • mbstring.http_output=UTF-8
  • mbstring.encoding_translation=On
  • mbstring.func_overload=6

MySQL

  • CREATE your database with an utf8_* collation, let the tables inherit the database collation and start every connection with "SET NAMES utf8"

HTML (in HEAD element)

  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
tekyo11
Auteur

Je ne suis pas certain. L'UTF8, si j'ai bien compris, encode bien les caractères de cette façon en remplaçant par exemple les "é" par "&ecute;".
Ce qui au final est très bien rendu sur le reste du programme tant que Autocomplete n'est pas utilisé.
Mais lorsque j'utilise Autocomplete de Jquery UI, là c'est la catastrophe du début jusqu'à la fin :
Le "WHERE CONCAT(firstname,lastname) LIKE :term" ne prend pas en charge les accents et la requete renvoie du non encodé.

Je me demande si laurocomplete de html 5 ne te permetterait pas de resoudre ton probleme.

tekyo11
Auteur

Le problème c'est que j'ai 2 champs texte à remplir à l'autocompletion et que Jquery me permet de faire ça parfaitement bien

Pourmoi lutf8 enregistre é en direct en base! Je ne suis pas sur que ta base soit bien encodé dans tout meS projets je mets un utf8 general en base avec mysql_query("SET NAMES 'utf8'"); et un meta html

tekyo11
Auteur

@François Cammas
j'ai suivi tous tes conseils, j'ai donc passé toute ma base de donnée en UTF8, sauf que quand je fais un update, il me remet les fameux caractères &ecute; et autres alors que de bout en bout, je suis bien en UTF8 .... ma requete PDO est codé en UTF8 gràce à SET NAMES 'utf8' ....
Je ne sais pas quoi faire.

Tu a mis quoi comme "interclassement" pour tes champs ?

tekyo11
Auteur

Toute la base est désormais en Utf8 général ci

Essaie de voir avec de nouveaux inserts voire si ça passe toujours pas.

Vérifies aussi que tous tes champs de tables sont bien passés en UTF-8

Bonjour,

j'ai du mal à suivre et à identifier clairement le problème.

Le problème est-il en lecture en base? ou en écriture en base?

S'il s'agit de la lecture, peux-t-on afficher la réponse par un echo (dans la page html avec le charset utf 8 qui va bien) ?

S'il s'agit de l'écriture, peux-t-on logguer avant la requête sql, le paramètre transmis côté serveur?

Si ces tests ne permettent pas d'identifier le problème , peut-on observer les requêtes xhr échangées? notamment au niveau des headers transmis (requête réponse) ?