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!!!

18
demandé sur Jonathan 2009-03-11 11:47:22

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.

31
répondu Stefan Gehrig 2017-05-23 12:31:56

Problème SET NAMES 'utf8' juste après la connexion:

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
10
répondu Quassnoi 2009-03-11 08:56:25

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);
9
répondu vartec 2009-03-11 10:29:10

changé le jeu de caractères HTML en ISO-8859-1 corrigé le problème! Idiot

4
répondu Jonathan 2009-03-11 10:13:35

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'");
3
répondu user117001 2013-05-05 19:24:07

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 ()

2
répondu Omar 2009-11-13 11:34:41

activez l'encodage unicode dans votre HTML.

1
répondu MrValdez 2009-03-11 08:51:40

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"
1
répondu Ionuț G. Stan 2009-03-11 09:10:02

Êtes-vous sûr que vous avez des données UTF8 dans votre base de données pour commencer?

1
répondu soulmerge 2009-03-11 10:00:11

Vous pouvez tout simplement faire:

$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
1
répondu Marco Rosas 2014-12-26 00:02:17

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...).

1
répondu justanotherITguy 2018-03-06 16:38:22

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

0
répondu ron 2013-08-11 16:20:20

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
0
répondu goosseno 2018-08-13 09:22:57