Question

Je suis nouveau ici, donc je m'excuse si je fais quelque chose de mal.

J'ai un formulaire qui soumet l'entrée de l'utilisateur sur une autre page. L'utilisateur devrait taper ä, Ö, é, etc ... J'ai placé tout ce qui suit dans le document:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
header('Content-Type:text/html; charset=UTF-8');
<form action="whatever.php" accept-charset="UTF-8">

J'ai même essayé:

ini_set('default_charset', 'UTF-8');

Lorsque l'autre page se charge, j'ai besoin de vérifier ce que l'utilisateur saisit avec quelque chose comme:

if ( $_POST['field'] == $check ) {
  ...
}

Mais s'il saisit quelque chose comme «München», PHP comparera «München» avec «München» et ne déclenchera jamais vrai même s'il le devrait. Puisqu'il est spécifié UTF-8 partout, je suppose que le serveur se convertit en autre chose (Windows-1252 comme je lis sur un autre thread) car il ne prend pas en charge ou n'est pas configuré en UTF-8. J'utilise Apache sur un serveur local avant de charger la production; Je n'ai changé (et je ne sais pas comment) aucun des paramètres par défaut. J'ai travaillé sur un Windows 7, éditant avec un nopad ++ détenant mes fichiers dans ANSI. Si je bin2hex('München') Je reçois '4DC3BC6E6368656E'.

Si je echo $_POST['field']; Il affiche correctement «München».

J'ai fait des recherches partout pour une explication, tout ce que je trouve, c'est que je devrais inclure ces balises / titres que j'ai déjà.

Toute aide est très appréciée.

Était-ce utile?

La solution

Vous rencontrez de nombreux problèmes différents en même temps, commençons par la plus simple.

Problème 1) Vous dites que echo $_POST['field']; L'affichera correctement? Que voulez-vous dire avec "Affichage"? Il peut être affiché correctement dans deux cas:

  • Le champ est dans UTF-8 et votre page a été déclarée UTF-8 et le navigateur l'affiche sous le nom de UTF-8 ou,
  • Le champ est en latin-1 et le navigateur a décidé (à travers l'heuristique de détection automatique) que votre page est en latin-1.

Alors, le fait que echo $_POST['field']; est correct ne vous dit rien.

Problème 2) Vous utilisez

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
header('Content-Type:text/html; charset=UTF-8');

Est ce code PHP? Si c'est le cas, ce sera une erreur car l'en-tête doit être réglé avant d'envoyer un octet. Si vous faites cela, vous ne définissez pas le Content-Type L'en-tête et le PHP devraient générer un avertissement.

Problème 3) Vous utilisez

<form action="whatever.php" accept-charset="UTF-8">

Certains navigateurs (c'est-à-dire, principalement) ignorent accept-charset S'ils peuvent contraindre les données à envoyer en ASCII ou ISO Latin-1. Les données seront donc dans UTF-8 et déclarées ISO Latin-1 ou ISO Latin-1 et envoyées comme ISO Latin-1 (mais ce deuxième cas n'est pas votre cas).

Jettes un coup d'oeil à https://stackoverflow.com/a/8547004/449288 pour voir comment résoudre ce problème.

Problème 4) Quelles chaînes comparez-vous? Par exemple, si vous avez

$city = "München"
$_POST['city'] == $city

Le résultat de ce code dépendra de l'encodage du fichier PHP. Si le fichier est codé dans ISO Latin-1 et le $_POST Contient correctement les données UTF-8, le == Comparera différents octets et reviendra faux.

Autres conseils

Une autre solution qui peut être utile est dans Apache, vous pouvez placer une directive dans votre fichier de configuration (httpd.conf) ou .htacess appelé AddDefaultCharset. Cela ressemble à ceci:

AddDefaultCharset utf-8

http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset

Qui remplacera tous les autressets par défaut.

J'ai changé "mbstring.detect_order = pass" dans mon fichier php.ini et j'ai travaillé

J'ai utilisé des caractères Unicode dans mes formulaires et des fichiers plusieurs fois. Je n'avais pas de problème jusqu'à présent. Essayez de faire ces étapes et vérifiez le résultat:

  1. Retirer header('Content-Type:text/html; charset=UTF-8'); à partir de vos codes de formulaire HTML.
  2. Utilisez votre formulaire comme <form action="whatever.php"> sans pour autant accept-charset="UTF-8". (Il est préférable d'insérer la méthode d'envoi de données dans votre balise de formulaire).
  3. Dans la page cible (quoi que ce soit.php), insérez à nouveau <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> dans un <head> étiquette.

J'ai toujours fait mon projet comme ce que j'ai mentionné ici et je n'ai eu aucun problème avec les chaînes Unicode.

Cela est dû au codage des caractères du (s) fichier (s) PHP.

Le codé dur München est stocké avec le codage de caractère du (s) fichier (s) source (s), dans ce cas ANSI et lorsque cette valeur est comparée à la valeur codée UTF-8 fournie dans le $_POST variable, les deux diffèrent tout naturellement.

La solution à votre problème est l'une des:

  1. Servir et traiter le contenu avec le même encodage que celui du (s) fichier (s) source, dans ce cas, il est susceptible d'être windows-1252.
    • Cela inclurait, pour les débutants, la modification du content="text/html; charset=UTF-8" à content="text/html; charset=windows-1252" Chaque fois que vous servez des données HTML.
  2. Évitez toutes les valeurs codées en dur qui pourraient être affectées par les problèmes de codage des caractères entre UTF-8 et windows-1252, plus ou moins uniquement les valeurs de code hard seulement Comprend des lettres et des chiffres anglais.
    • N'importe quel UTF-8 Les valeurs devraient être lues à partir d'une source qui garantit qu'elles sont UTF-8 Encodé (par exemple un ensemble de base de données à utiliser UTF-8 comme codage de stockage ainsi que le codage de connexion).
  3. Enveloppez toutes les affectations codées en dur dans utf8_encode(), par exemple $value = utf8_encode ('München');
  4. Modifier le codage du (s) fichier (s) source en UTF-8.
    • Cela peut être accompli de plusieurs façons, un éditeur de texte décent pourra le faire ou les exceptionnels libiconv Peut être utilisé, en particulier pour le traitement par lots.

Soit la solution 1 ou 4 serait ma solution préférée, surtout si plusieurs personnes sont impliquées dans le projet.

En tant que note latérale, certains éditeurs de texte (notamment Notepad++) a la possibilité d'utiliser soit UTF-8 ou UTF-8 without BOM. La BOM (Marque de commande d'octet) est inutile dans UTF-8 et causera des problèmes lors de la rédaction d'en-têtes en PHP (le plus souvent lorsque vous effectuez une redirection). C'est parce que le BOM est juste en face de l'initiale <?php, provoquant le fait d'envoyer le serveur BOM Tout comme il aurait eu un autre personnage devant. La différence est que vous notez un personnage devant, mais le BOM n'est pas affiché.
Règle de base: Utilisez toujours UTF-8 sans bom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top