89 votes

Sortie PHP affichant des petits losanges noirs avec un point d'interrogation

Je suis en train d'écrire un programme php qui tire des données d'une base de données. Je ne sais pas si je peux me permettre de le faire, mais je ne sais pas non plus si je peux me permettre de le faire, CARACTÈRE DE REMPLACEMENT (je suppose qu'il s'agit d'un texte Microsoft Word).

Comment puis-je utiliser php pour supprimer ces caractères ?

81voto

hop Points 15423

Si vous voyez ce caractère (� U+FFFD "REPLACEMENT CHARACTER"), cela signifie généralement que le texte lui-même est codé dans une forme de codage à un octet, mais interprété dans l'un des codages unicode (UTF8 ou UTF16).

Si c'était l'inverse, cela ressemblerait (généralement) à quelque chose comme ceci : ä.

L'encodage original est probablement l'ISO-8859-1, également connu sous le nom de Latin-1. Vous pouvez le vérifier sans avoir à modifier votre script : les navigateurs vous donnent la possibilité de réinterpréter une page dans un encodage différent -- dans Firefox, utilisez "Affichage" -> "Encodage des caractères".

Pour que le navigateur utilise le bon encodage, ajoutez un en-tête HTTP comme celui-ci :

header("Content-Type: text/html; charset=ISO-8859-1");

ou mettre l'encodage dans une balise méta :

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Vous pouvez également essayer de lire la base de données dans un autre encodage (UTF-8, de préférence) ou de convertir le texte à l'aide de la fonction iconv() .

52voto

Echt Einfach TV Points 1091

J'ai également été confronté à ce � problème. Entre-temps, j'ai rencontré trois cas où cela s'est produit :

  1. substr()

    J'utilisais substr() sur une chaîne UTF8 qui coupait des caractères UTF8, les caractères coupés ne pouvaient donc pas être affichés correctement. Utiliser mb_substr($utfstring, 0, 10, 'utf-8'); au lieu de cela. Crédits

  2. htmlspecialchars()

    Un autre problème était l'utilisation de htmlspecialchars() sur une chaîne UTF8. La solution consiste à utiliser : htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace()

    Enfin, j'ai découvert que preg_replace() peut entraîner des problèmes avec l'UTF. Le code $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string); a par exemple transformé la chaîne UTF "F(×)=2×-3" en "F � 2� ". La solution consiste à utiliser mb_ereg_replace() au lieu de cela.

J'espère que ces informations supplémentaires vous aideront à vous débarrasser de ces problèmes.

42voto

troelskn Points 51966

Il s'agit d'un problème de jeu de caractères. En tant que tel, il peut y avoir un problème à différents niveaux, mais le plus probable est que les chaînes de votre base de données sont encodées en utf-8 et que vous les présentez en iso-8859-1. Ou l'inverse.

La meilleure façon de résoudre ce problème est de mettre de l'ordre dans les jeux de caractères. La stratégie la plus simple, puisque vous utilisez PHP, est d'utiliser iso-8859-1 dans toute votre application. Pour ce faire, vous devez vous assurer que

  • Tous les fichiers sources de PHP sont sauvegardés en iso-8859-1 (à ne pas confondre avec cp-1252).
  • Votre serveur web est configuré pour servir des fichiers avec l'extension charset=iso-8859-1
  • Vous pouvez également modifier les paramètres du serveur Web à partir du document PHP, en utilisant la commande suivante header .
  • En outre, vous peut insérer une balise méta dans votre HTML, qui spécifie la même chose, mais ce n'est pas strictement nécessaire.
  • Vous peut précisent également le accept-charset sur votre <form> éléments.
  • Les tables de la base de données sont définies avec l'encodage latin1
  • La connexion entre PHP et la base de données est définie sur latin1

Si vous avez déjà des données dans votre base de données, vous devez savoir qu'elles sont probablement déjà perturbées. Si vous n'êtes pas encore en phase de production, effacez tout et recommencez. Dans le cas contraire, vous devrez procéder à un nettoyage des données.

Une remarque sur les métabalises, car tout le monde se méprend sur leur nature :

Lorsqu'un serveur web sert un fichier (un document HTML), il envoie des informations qui ne sont pas présentées directement dans le navigateur. Ces informations sont connues sous le nom d'en-têtes HTTP. L'un de ces en-têtes est l'en-tête Content-Type qui spécifie le type de fichier (mimetype) (ex. text/html ) ainsi que l'encodage (ou charset). Alors que la plupart des serveurs web envoient un Content-Type avec charset info, c'est facultatif. S'il n'est pas présent, le navigateur interprétera à la place toutes les balises méta avec la mention http-equiv="Content-Type" . Il est important de comprendre que la balise méta est sólo interprété si le serveur web n'envoie pas l'en-tête. En pratique, cela signifie qu'il n'est utilisé que si la page est enregistrée sur le disque et ouverte à partir de là.

Cette page a une très bonne explication de ces choses.

13voto

Hamlet Kraskian Points 61

Comme indiqué dans les réponses précédentes, cela se produit parce que votre texte a été écrit dans la base de données en iso-8859-1 ou tout autre format.

Il suffit donc de convertir les données en utf8 avant de l'éditer.

$text = “string from database”;
$text = utf8_encode($text);
echo $text;

12voto

ptwiggerl Points 56

Pour vous assurer que votre connexion MYSQL est configurée en UTF-8 (ou latin1, selon ce que vous utilisez), vous pouvez faire ceci :

$con = mysql_connect("localhost","username","password");    
mysql_set_charset('utf8',$con);

ou utilisez ceci pour vérifier le jeu de caractères que vous utilisez :

$con = mysql_connect("localhost","username","password");   
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n"; 

Plus d'informations ici : http://php.net/manual/en/function.mysql-set-charset.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X