Caractères spéciaux en PHP / MySQL
j'ai dans la base de données des mots qui incluent des caractères spéciaux (en espagnol surtout, comme tildes). Dans la base de données tout est enregistré et affiché correctement avec PHPmyAdmin, mais quand je reçois les données (en utilisant PHP) et les affiche dans un navigateur, je reçois un caractère bizarre, comme un "?"avec un carré... J'ai besoin d'un correctif général pour ne pas avoir besoin d'échapper à chaque caractère à chaque fois, et aussi je serais capable d'insérer des Caractères espagnols spéciaux à partir d'un formulaire PHP dans la base de données...
Le HTML est correct:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
toutes les tables et bases de données sont définies à utf8_spanish
le personnage que j'obtiens: փ
des suggestions???
Merci!!!
13 réponses
je voudrais juste fournir plus de détails sur la solution proposée par vartec qui est (selon votre installation MySQL) la solution la plus correcte à votre problème. Tout d'abord, la question des jeux de caractères / encodage dans MySQL est un sujet quelque peu complexe qui est largement couvert dans le manuel MySQL Chapitre 9.1 "Charge Du Jeu De Caractères". Dans votre cas, en particulier 9.1.4. "Connexion de Jeux de Caractères et les Classements" seront les plus pertinent.
pour faire court: MySQL doit savoir quel jeu de caractères / encodage de votre application client (parlant à partir de la persoective de base de données qui est votre script PHP) attend comme il va transcoder toutes les données de chaîne du jeu de caractères / encodage interne défini au niveau du serveur, de la base de données, de la table-ou de la colonne dans le jeu de caractères / encodage de connexion. Vous utilisez UTF-8 du côté du client, donc vous devez dire à MySQL que vous utilisez UTF-8. Ceci est fait par la commande MySQL SET NAMES 'utf8'
laquelle doit être envoyée la première requête sur l'ouverture d'une connexion. En fonction de votre installation et de la bibliothèque client MySQL que vous utilisez dans le script PHP, cela peut être fait automatiquement sur chaque connexion.
si vous utilisez PDO c'est juste une question de paramétrer un paramètre de configuration
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
en utilisant mysqli changer le jeu de caractères / encodage du client est encore plus simple:
$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");
j'espère que cela aidera à rendre le tout plus compréhensible.
Problème SET NAMES 'utf8'
juste après la connexion:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
demandez à MySQL de le traduire automatiquement
$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);
http://es.php.net/manual/en/function.mysql-set-charset.php
EDIT: à partir de votre commentaire je me rends compte que c'est en fait encodé en latin1 donc
mysql_set_charset('latin1_spanish_ci',$conn);
changé le jeu de caractères HTML en ISO-8859-1 corrigé le problème! Idiot
j'ai trouvé ceci quelque part et depuis lors je l'ai utilisé dans son ensemble sans trop y penser.
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
saint de la merde.. cela me rendait folle. j'ai essayé de faire la même chose. j'ai ajouté un en-tête d'encodage utf-8 HTML.. mysqli_set_charset () m'a sauvé, des heures plus tard, mais je suis content que cela fonctionne maintenant
une autre fonction à essayer pour encoder les caractères spéciaux et les accents est htmlentities ()
quand je traite avec des personnages spéciaux, je m'occupe toujours de ce qui suit:
- les jeux de caractères de la base de données, de la table et des champs sont tous définis à utf8_general_* ou utf8_unicode_*
- Je m'assure que mon éditeur sauvegarde les fichiers PHP avec le bon jeu de caractères
- j'ai défini default_charset en php.ini to UTF-8 ou
- j'ai envoyer un Content-Type: text/html; charset=UTF-8 à en-tête
- le jeu de caractères dans la balise META est UTF-8 (ceci est remplacé par le Contenu-Type d'en-tête HTTP)
- lors de la connexion à MySQL, je lance les requêtes suivantes::
- SET NAMES utf8
- SET CHARACTER SET utf8
- SET COLLATION_CONNECTION= "utf8_general_ci" / "utf8_general_ci"
Êtes-vous sûr que vous avez des données UTF8 dans votre base de données pour commencer?
Vous pouvez tout simplement faire:
$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
La réponse qui a fonctionné pour moi est celui que Stefan Gehrig posté le:
$ mysqli - > set_charset ("utf8");
j'avais juste besoin d'ajouter cette ligne après avoir défini la connexion et mes problèmes résolus! :)
(je suis de poster une réponse étant donné que je ne peux pas commenter...).
ma solution est : tous offerts mais aussi, je travaille avec notepad++ et le fichier doit être enregistré comme ceci :aller à l'encodage dans l'onglet manu et enregistrer le fichier ->encoder en utf8
Interestedly, ce code ne fonctionne pas pour moi:
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1
Toutefois, le réglage du jeu de caractères à l'intérieur d'une condition fonctionne:
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows utf8
}
Ma configuration:
$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64