web-dev-qa-db-fra.com

Les pages HTML encodées en UTF-8 affichent � (points d'interrogation) au lieu de caractères

J'ai l'installation standard de XAMPP sur win7 (x64). Ayant eu ma part de problèmes d'encodage dans un projet précédent où l'encodage mysql ne correspondait pas à l'encodage php qui, à son tour, produisait parfois du HTML dans d'autres encodages, j'ai décidé de tout encoder de manière cohérente en utilisant utf-8.

Je viens de commencer avec le balisage html et je rencontre déjà des problèmes.

  • Ma page est enregistrée en utilisant utf-8 (pas de nomenclature, je pense)
    // mise à jour: Il s'avère que ce n'était PAS le cas. Le fichier a été enregistré avec ISO_8859-1. J'ai découvert cela plus tard grâce à la réponse de Sherm Pendleys. J'ai dû revenir et modifier mes paramètres de projet (qui ont été définis sur "ISO-8859-1") pour le "UTF-8" souhaité.
  • php est défini par .htaccess pour servir les pages .php dans utf-8 avec: AddCharset UTF-8 .php
  • html a une balise meta spécifiant: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • Pour tester j'ai mis php header('Content-Type:text/html; charset=UTF-8');

La page est évidemment servie dans utf-8 (firefox et chrome le reconnaissent comme tel) mais tous les caractères spéciaux tels que é, á Ou ¡ S'affiche simplement sous la forme . Également lors de la visualisation du code source.

Lors de la suppression des paramètres d'encodage mentionnés ci-dessus, tous les caractères sont rendus correctement, mais l'encodage détecté affiche windows-1252 Ou ISO-8859-1 Selon le navigateur.

Comment venir? Je suis très perplexe. Je m'attendais au comportement opposé exact.
Tout conseil est le bienvenu, merci!

edit: J'espère que cela aide un peu plus. Ceci est l'en-tête de réponse (selon Firebug)

HTTP/1.1 200 OK
Date: Sat, 26 Mar 2011 20:49:44 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_Perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 91
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
32
leugim

Lors de la [suppression] les paramètres d'encodage mentionnés ci-dessus, tous les caractères [sont rendus] correctement, mais l'encodage détecté affiche Windows-1252 ou ISO-8859-1 selon le navigateur.

C'est ce que vous envoyez vraiment. Aucun des paramètres d'encodage de votre liste à puces ne modifiera votre sortie de quelque façon que ce soit; ils ne font que dire au navigateur quel encodage assumer lors de l'interprétation de ce que vous envoyez. C'est pourquoi vous obtenez ces �s - vous dites au navigateur que ce que vous envoyez est UTF-8, mais c'est vraiment ISO-8859-1.

22
Sherm Pendley

Dans mon cas, la base de données a renvoyé latin1, quand mon navigateur attendait utf8.

Donc pour MySQLi j'ai fait:

 mysqli_set_charset($dblink, "utf8");    

Voir http://php.net/manual/en/mysqli.set-charset.php pour plus d'informations

13
Dennis

Vérifiez si l'un de vos .php fichiers qui imprimant du texte, est également correctement encodé dans utf-8.

6
IProblemFactory

Dites à PDO votre charset initialement .... quelque chose comme

PDO("mysql:Host=$Host;dbname=$DB_name;charset=utf8;", $username, $password);

Remarquez le: charset=utf8; partie.

j'espère que ça aide!

5
ErickBest

Je viens du Brésil et je crée mes bases de données en utilisant latin1_spanish_ci. Pour le html et tout le reste que j'utilise:

charset=ISO-8859-1

Les données vont bien avec é, ã et ç... Parfois je dois mettre les textes du html en utilisant le code de celui-ci, tels que:

Ol&aacute;

donne moi

Olá

Vous pouvez trouver les codes sur cette page: http://www.ascii.cl/htmlcodes.htm

J'espère que cela t'aides. Je me souviens que c'était vraiment ennuyeux.

2
SPL_Splinter

On dirait que personne n'a mentionné

SET NAMES utf8;

J'ai trouvé cette solution ici et cela m'a aidé. Comment l'appliquer:

Pour être tout UTF-8, émettez la déclaration suivante juste après avoir établi la connexion au serveur de base de données: SET NAMES utf8;

Peut-être que cela aidera quelqu'un.

2
Vitalius

Le problème est le jeu de caractères utilisé par Apache pour servir les pages. Je travaille avec Linux, donc je ne connais rien à XAMPP. J'ai également eu le même problème, ce que j'ai fait pour résoudre le problème a été d'ajouter le jeu de caractères au fichier de configuration charset (il est commenté par défaut).

Dans mon cas, je l'ai dans /etc/Apache2/conf.d/charset mais, puisque vous utilisez Windows, l'emplacement est différent. Je vous donne donc ceci comme une idée de la façon de le résoudre.

À la fin, mon fichier de configuration charset est comme ceci:

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

AddDefaultCharset UTF-8

J'espère que ça aide.

1
EmCo