2010-11-30 28 views
4

Im face à un problème vraiment stressant ici .. j'ai tout en UTF-8, tous mes BD et tables sont utf8_general_ci mais en essayant d'insérer ou de mettre à jour un seul script PHP tout ce que je vois sont des symboles .. mais si je modifie en phpmyadmin les mots sont affichés correctement .. je trouve que si je cours la fonction utf8_decode() à mes chaînes en PHP je peux le faire fonctionner, mais je ne prévois pas de le faire parce que c'est un gâchis et il devrait fonctionner sans le faire: SImpossible d'insérer des caractères utf8 sur mysql (avec collation utf8, jeu de caractères et jeu de caractères)

est ici un im code de base en utilisant pour tester ceci:

<?php 
$conn=mysql_connect("localhost","root","root") 
    or die("Error"); 
mysql_select_db("mydb",$conn) or 
    die("Error"); 
mysql_query("UPDATE `mydb`.`Clients` SET `name` = '".utf8_decode("Araña")."' WHERE `Clients`.`id` =25;", 
    $conn) or die(mysql_error()); 
mysql_close($conn); 
echo "Success."; 
?> 

Voici ce que je obtenir si je ne decode UTF8 avec fonction php utf8_decode:

au lieu de Araña, je reçois: ARAA ± a

Répondre

1

"ARAA ± a" est UTF-8. Les caractères "Ã" représentent les deux octets dans lesquels les espagnols sont encodés en UTF-8. Tout ce que vous lisez avec ne pas manipuler l'UTF-8 et l'affiche comme (il apparaît) ISO-8859-1.

4

J'ai souvent rencontré le même problème. Parfois, c'est parce que le type de lien de la base de données que je sélectionne n'est pas le même que celui que j'utilise pour l'insertion et d'autres fois, c'est à partir des données du fichier dans une base de données.

Pour l'instance suivante, mysql_set_charset('utf8',$link); est la réponse magique.

Placez l'appel à mysql_set_charset juste après avoir sélectionné votre base de données via mysql_select_db.

@ref http://php.net/manual/en/function.mysql-set-charset.php

+2

Merci de m'avoir fait ma journée! – jtanmay

+0

Laissez-moi vous acheter une bière. Vous venez de résoudre des heures sans fin de douleur – AlBeebe

1

Ce ddl vous avez mentionné doit faire avec le classement, pas le jeu de caractères. La déclaration correcte serait:

ALTER TABLE Clients CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

Vous devez toujours vous assurer que la bibliothèque client (libmysql ou quoi que PHP pilote utilise) n'est pas transcoder les données à ISO-8859. mysql_set_charset ('utf8') définira explicitement le codage du client sur UTF-8. Alternativement, vous pouvez envoyer un SET NAMES UTF8; juste après vous vous connectez à la base de données. Pour ce faire implicitement, vous pouvez changer le bloc my.cnf [client] pour avoir utf-8 comme encodage de caractères client (et /etc/init.d/mysql reload pour s'appliquer). De toute façon, assurez-vous que le client ne déforme pas les résultats qu'il tire.

[client] default-character-set = UTF8

Vous n'avez pas besoin d'utiliser utf8_decode si vous utilisez mbstrings. La configuration php.ini suivante doit assurer un soutien UTF-8 sur le côté PHP:

mbstring.internal_encoding = utf-8 
mbstring.http_output = utf-8 
mbstring.func_overload = 6 

Enfin, lorsque vous affichez les résultats en HTML, vérifiez que le codage de la page est explicitement UTF-8.