jQuery: UTF-8 ne fonctionne pas avec la requête ajax

J’ai un fichier php qui utilise jQuery.ajax() pour récupérer des données d’un autre fichier php dans un div.

 jQuery.ajax({ type: 'POST', encoding:"UTF-8", dataType:"html", contentType: "text/plain; charset=UTF-8", url: '/path/data.php', success: function(msg) { jQuery('#dataBox').html(msg); } }); 

Mon problème est que si j’ai des caractères “spéciaux” dans les données que je reçois à travers ajax tel que åäö, alors j’obtiens le repère “point d’interrogation dans un diamant noir”. Si j’ouvre le fichier externe dans le navigateur, cela fonctionne. Si je mets des caractères spéciaux sur la page principale, cela fonctionne.

Un code simplifié:

data.php:

 $mysqli = new mysqli("localhost", "username", "pass", "db"); $mysqli->set_charset("utf8"); $mysqli->query("SET GLOBAL time_zone = '+00:00'"); $stmt = $mysqli -> prepare("SELECT GROUP_CONCAT(sometext) AS mytext FROM `mytable`"); $stmt -> execute(); $results = selectResults($stmt); $stmt -> close(); $mysqli -> close(); 

fonction selectResults:

 function selectResults($stmt) { $parameters = array(); $results = array(); $meta = $stmt->result_metadata(); while ( $field = $meta->fetch_field() ) { $parameters[] = &$row[$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $parameters); while ( $stmt->fetch() ) { $x = array(); foreach( $row as $key => $val ) { $x[$key] = $val; } $results[] = $x; } return $results; } 

data.php:

 foreach($results as $result){ $textArray = explode(',', $result['mytext']); } foreach($textArray as $text){ echo($text); } 

Désolé, mais si vous obtenez le caractère de remplacement unicode , l’entrée a été interprétée en UTF-8 mais les octets bruts de l’entrée ne correspondent pas à UTF-8. En d’autres termes, il ne s’agissait pas d’UTF-8.

Si vous voyez les caractères corrects lorsque vous visitez directement la page, il doit s’agir des parameters ajax forçant l’interprétation en UTF-8 sur des données codées en autre, le paramètre par défaut est Windows-1252 pour les navigateurs.

Publiez le code php et / ou les octets bruts des données.

J’écrirai ceci comme une réponse car cela pourrait aider les autres plus facilement.

Pour résoudre le problème, vous devez vous assurer que le contenu que vous générez est le même que celui attendu par ajax. Ainsi, pour utf-8, le contenu doit être utf-8 ou encodé en tant que utf-8.

 utf8_encode($content); 

Si vous pouviez fournir du contenu utf-8 à partir de la firebase database, Esailija vous dit que vous n’auriez pas besoin d’utiliser la fonction encoder.

Corrigé en définissant utf8_encode() autour des données que je echo() dans le fichier data.php. Je n’ai pas pensé à essayer ceci car cela a bien fonctionné lors de l’ouverture de data.php dans le navigateur.

MODIFIER:

Déplacé utf8_encode() vers la fonction selectResults afin de coder toutes les valeurs que je récupère de la firebase database.