Question

Il arrive souvent que des caractères tels que é soient transformés en à © , même si le classement de la base de données, table et champ MySQL est défini sur utf8_general_ci. Le codage dans le Content-Type de la page est également défini sur UTF8.

Je connais utf8_encode / decode, mais je ne sais pas trop où et comment l'utiliser.

J'ai lu le & Le minimum absolu que tout développeur de logiciel doit absolument savoir à propos de Unicode et Jeux de caractères (sans excuses!) " article, mais j’ai besoin d’indicateurs spécifiques à MySQL / PHP.

Question: Comment puis-je m'assurer que les données saisies par l'utilisateur contenant des caractères internationaux ne sont pas corrompues?

Était-ce utile?

La solution

À propos du http://www.nicknettleton.com / zine / php / php-utf-8-cheatsheet Je pense qu’un élément important est manquant (j’ai peut-être oublié celui-ci). Selon votre installation et / ou votre configuration MySQL, vous devez définir le codage de la connexion afin que MySQL sache quel codage vous attendez du côté client (c'est-à-dire le côté client de la connexion MySQL, qui devrait être votre script PHP). Vous pouvez le faire en émettant manuellement un

SET NAMES utf8

requête préalable à toute autre requête que vous envoyez au serveur MySQL.

Si vous utilisez PDO côté PHP, vous pouvez configurer la connexion pour émettre automatiquement cette requête à chaque (re) connexion en utilisant

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

lors de l'initialisation de votre connexion à la base de données.

Autres conseils

Le classement et le jeu de caractères ne sont pas la même chose. Votre classement doit correspondre au jeu de caractères. Par conséquent, si votre jeu de caractères est utf-8, il doit en être de même pour le classement. Si vous choisissez le mauvais classement, vos données ne seront pas perturbées: il suffit que la comparaison / le tri de chaînes ne fonctionnent pas correctement.

Cela dit, il existe plusieurs endroits où vous pouvez définir les paramètres de jeu de caractères en PHP. Je recommanderais que vous utilisiez utf-8 partout, si possible. Les endroits nécessitant un jeu de caractères spécifié sont:

  • La base de données. Cela peut être défini au niveau de la base de données, de la table et du champ, et même au niveau de chaque requête.
  • Connexion entre PHP et la base de données.
  • sortie HTTP; Assurez-vous que l'en-tête HTTP Content-Type spécifie utf-8. Vous pouvez définir les valeurs par défaut dans PHP et Apache, ou vous pouvez utiliser le en-tête fonction.
  • Entrée HTTP. Généralement, les formulaires seront soumis dans le même jeu de caractères que celui dans lequel la page a été servie, mais pour être sûr, vous devez spécifier le Propriété accept-charset . Assurez-vous également que les URL sont codées en utf-8 ou évitez d’utiliser des caractères non ascii dans les URL (paramètres And GET).

utf8_encode / Les fonctions de décodage sont un peu étrangement nommées. Ils convertissent spécifiquement entre latin1 (ISO-8859-1) et utf-8. Si tout dans votre application est en utf-8, vous ne les utiliserez pas beaucoup.

Il y a au moins deux pièges concernant utf-8 et PHP. La première est que les fonctions de chaîne intégrées de PHP s'attendent à ce que les chaînes soient codées sur un octet. Cela n'a pas d'importance pour beaucoup d'opérations, mais cela signifie que vous ne pouvez pas compter sur strlen et d’autres fonctions. Il existe une bonne liste des limitations sur la cette page . Habituellement, ce n'est pas un gros problème, mais surtout lorsque vous utilisez des bibliothèques à 3 parties, vous devez être conscient du fait que les choses pourraient exploser. Une option consiste également à utiliser l'extension mb_string, qui permet de remplacer toutes les fonctions problématiques par des alternatives compatibles avec utf-8. Ce n’est toujours pas une solution à 100%, mais cela fonctionnera dans la plupart des cas.

Un autre problème est que certaines installations de PHP ont toujours le magic_quotes activé. Ce problème est orthogonal à utf-8, mais peut entraîner des problèmes de tête. Éteignez-le, pour votre santé mentale.

Pas grand chose à dire qui n'est pas couvert par cet article

http://developer.loftdigital.com/blog/php-utf -8-feuille de triche

Ce que vous devriez faire:

  • Assurez-vous qu'Apache publie du contenu UTF-8. Faites cela dans votre httpd.conf, ou utilisez la fonction header () de PHP pour le faire manuellement.
  • Assurez-vous que votre connexion à la base de données est UTF8. SET NAMES utf8 fait l'affaire.
  • Assurez-vous que toutes vos tables sont définies sur UTF8.
  • Assurez-vous que tous vos fichiers PHP et modèles sont codés au format UTF8 si vous y stockez des caractères internationaux.

Vous n'avez généralement pas à faire grand chose en utilisant les fonctions mb_string ou utf8_encode / decode lorsque vous le faites.

Pour une meilleure exactitude unicode, vous devriez utiliser utf8_unicode_ci (bien que la documentation soit un peu vague sur les différences). Vous devez également vous assurer que les indicateurs Mysql suivants sont définis correctement -

  • default-character-set = utf8
  • skip-character-set-client-handshake // Important pour que le client n'impose pas un autre encodage

Ceux-ci peuvent être définis dans le fichier de configuration mysql (sous l'onglet [mysqld]) ou au moment de l'exécution en envoyant les requêtes appropriées.

Indépendamment de la langue dans laquelle il est écrit, si vous deviez créer une application qui permet un large éventail d’encodages, gérez-la par morceaux:

  • Identifiez le codage
    • vous voulez savoir quel type d’encodage vous utilisez, sinon, il est inutile de l’étudier plus en profondeur. Vous allez vous retrouver avec des caractères indésirables.
  • Gérez vos octets
    • pense que ces chaînes sont moins des "chaînes" de caractères que des listes d'octets
    • PHP est particulièrement sournois. Ne le laissez pas tronquer vos données à la volée. Si vous rationnez une chaîne UTF-8, assurez-vous de l'identifier comme tel
  • Store pour l'écran LCD
    • Encore une fois, vous ne voulez pas tronquer les données. Si vous enregistrez une phrase en anglais, pouvez-vous également enregistrer un ensemble de glyphes en mandarin? Que diriez-vous de l'arabe? Lequel d'entre eux nécessitera le plus d'espace? Compte pour cela.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top