web-dev-qa-db-fra.com

Caractères spéciaux dans PHP / MySQL

J'ai dans la base de données des mots qui incluent des caractères spéciaux (principalement en espagnol, tels que tildes). Dans la base de données, tout est sauvegardé et affiché correctement avec PHPmyAdmin, mais lorsque je récupère les données (avec PHP), je les affiche un navigateur, je reçois un caractère étrange, comme un "?" avec un carré ... J'ai besoin d'une correction générale pour ne pas devoir échapper à chaque caractère à chaque fois et je pourrais également 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 sur utf8_spanish

Le personnage que je reçois:

Aucune suggestion???

Merci!!!

18
Jonathan

Le jeu de caractères HTML modifié en ISO-8859-1 a résolu le problème! Idiot

4
Jonathan

Je voudrais juste donner quelques détails supplémentaires sur la solution proposée par vartec qui est (selon votre installation de MySQL) la solution la plus correcte pour votre problème. Tout d’abord le jeu de caractères/encodage Ce problème dans MySQL est un sujet assez complexe qui est traité de manière exhaustive dans le manuel MySQL Chapitre 9.1 "Support du jeu de caractères" . Dans votre cas surtout 9.1.4. "Jeux de caractères de connexion et classements" seront les plus pertinents.

Pour faire court: MySQL doit savoir quel jeu de caractères/quel encodage votre application client (conversation de la base de données persoective qui est votre script PHP est attendue, car elle transcodera toutes les données de chaîne du jeu de caractères interne/codage défini au niveau du serveur, de la base de données, des tables ou des colonnes dans le jeu/codage de caractères de connexion. Vous utilisez UTF-8 côté client, vous devez donc indiquer à MySQL que vous utilisez UTF-8. Ceci est fait par la commande MySQL SET NAMES 'utf8' qui doit être envoyée en tant que première requête lors de l’ouverture d’une connexion. En fonction de votre installation et de la bibliothèque client MySQL que vous utilisez dans le script PHP, vous pouvez le faire automatiquement à chaque connexion.

Si vous utilisez PDO, il vous suffit de définir un paramètre de configuration.

$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

Utiliser mysqli pour changer le jeu de caractères client/encodage est encore plus simple:

$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");

J'espère que cela contribuera à rendre le tout plus compréhensible.

31
Stefan Gehrig

Émettez SET NAMES 'utf8' juste après la connexion:

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
10
Quassnoi

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: de votre commentaire, je suppose, que cela est en fait codé en latin1 afin 

mysql_set_charset('latin1_spanish_ci',$conn);
9
vartec

J'ai trouvé cela quelque part et depuis, je l'utilise comme un tout 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'");
3
user117001

merde sainte .. cela me rendait fou. J'essayais de faire la même chose. J'ai ajouté un en-tête HTML pour le codage utf-8 .. mysqli_set_charset () m'a sauvé des heures plus tard, mais je suis heureux de l'avoir maintenant.

une autre fonction à essayer pour encoder les caractères spéciaux et les accents est htmlentities ()

2
Omar

Vous pouvez simplement faire:

$link = mysql_connect("Host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
1
Marco Rosas

Etes-vous sûr d'avoir des données UTF8 dans votre base de données pour commencer?

1
soulmerge

Activez le codage Unicode dans votre code HTML.

1
MrValdez

Lorsque je traite des caractères 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 du champ sont tous définis sur utf8_general_ * ou utf8_unicode_ *
  • Je m'assure que mon éditeur enregistre PHP fichiers avec le bon jeu de caractères.
  • J'ai défini default_charset dans php.ini sur UTF-8 ou
  • J'envoie un type de contenu: text/html; jeu de caractères = en-tête UTF-8
  • Le jeu de caractères dans la balise META est UTF-8 (remplacé par l'en-tête HTTP Content-Type)
  • Lors de la connexion à MySQL, les requêtes suivantes sont émises:
    • SET NOMS utf8
    • SET PERSONNAGE SET utf8
    • SET COLLATION_CONNECTION = "utf8_general_ci"/"utf8_general_ci"
1
Ionuț G. Stan

La réponse qui a fonctionné pour moi est celle que Stefan Gehrig a postée: 

$ mysqli-> set_charset ("utf8");

J'avais juste besoin d'ajouter cette ligne après avoir défini la connexion et mes problèmes étaient résolus! :)

(Je poste une réponse car je ne peux pas commenter ...).

1
justanotherITguy

Intéressé, ce code n'a pas fonctionné 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

Cependant, définir le jeu de caractères dans 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
0
goosseno

ma solution est la suivante: faire tout ce qui est proposé ci-dessus mais aussi travailler avec notepad ++ et le fichier doit être sauvegardé comme ceci: aller au codage dans l'onglet manu et sauvegarder le fichier -> encoder en utf8

0
ron