Les meilleures pratiques en PHP et MySQL avec chaînes internationales
Il arrive souvent que des personnages comme é se transforme en é, même si le classement de la DB MySQL, de table et de champ est utf8_general_ci. L'encodage dans le Content-Type de la page est également défini en UTF8.
Je sais à propos de utf8_encode/décoder, mais je ne suis pas tout à fait sûr de savoir où et comment l'utiliser.
J'ai lu le "Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!)" de l'article, mais j'ai besoin de quelques MySQL /PHP spécifique des pointeurs.
Question: Comment puis-je m'assurer que l'utilisateur a entré les données contenant des caractères internationaux ne sont pas corrompus?
Vous devez vous connecter pour publier un commentaire.
Sur le premier coup d'oeil à http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet je pense que la chose importante est manquant (peut-être que j'ai oublié celui-ci).
En fonction de votre installation de MySQL et/ou de configuration, vous devez définir la connexion de codage, de sorte que MySQL ne sait quel encodage vous attendons sur le côté client (sens du côté client de la connexion MySQL, qui devrait être vous script PHP). Vous pouvez le faire manuellement par l'émission d'un
requête avant pour toute autre demande que vous envoyez au serveur MySQL.
Si vous êtes en utilisant PDO sur le PHP côté, vous pouvez configurer la connexion à émettre automatiquement cette requête sur tous les (re)connecter à l'aide de
lors de l'initialisation de votre connexion db.
Classement et le jeu de caractères ne sont pas la même chose. Le classement doit correspondre à la table de caractères, si votre jeu de caractères utf-8, donc si le classement. La cueillette le mauvais classement de ne pas corrompre vos données, bien que tout à fait à la chaîne de comparaison/tri de travail à tort.
Cela dit, il y a plusieurs endroits où vous pouvez définir le jeu de caractères des paramètres en PHP. Je vous recommande d'utiliser l'utf-8 partout, si possible. Endroits qui doit charset spécifié sont:
Content-Type
spécifie l'encodage utf-8. Vous pouvez définir des valeurs par défaut dans PHP et Apache, ou vous pouvez utiliser PHPheader
fonction.accept-charset
de la propriété. Assurez-vous également que les URL sont codés en utf-8, ou d'éviter d'utiliser des caractères non-ascii dans les urls (Et les paramètres GET).utf8_encode
/décoder les fonctions sont un peu étrangement nommé. Ils ont spécifiquement convertir entre latin1 (ISO-8859-1 et utf-8. Si tout dans votre application est en utf-8, vous n'aurez pas à utiliser beaucoup.Il y a au moins deux problèmes en ce qui concerne l'utf-8 et PHP. La première est que PHP est builtin fonctions de chaîne s'attendre à des chaînes sur un seul octet. Pour beaucoup d'opérations, ce n'est pas grave, mais cela signifie que vous ne pouvez pas compter sur
strlen
et d'autres fonctions. Il est bon de les limitations à cette page. Généralement, ce n'est pas un gros problème, mais surtout lors de l'utilisation de 3 bibliothèques de tiers, vous devez être conscient que les choses risquent d'exploser sur cette. Une option est d'utiliser le mb_string extension, qui a la possibilité de remplacer tous les pénibles fonctions avec l'encodage utf-8 au courant des solutions de rechange. Il n'est pas encore à 100% à l'épreuve des balles solution, mais il va travailler pour la plupart des cas.Un autre problème est que certaines installations de PHP a toujours le
magic_quotes
paramètre est activé. Ce problème est orthogonal à utf-8, mais peut conduire à des casse-tête. L'éteindre, pour votre propre santé mentale du saké.Pas grand chose à dire qui n'est pas couvert par le présent article
http://developer.loftdigital.com/blog/php-utf-8-cheatsheet
Choses que vous devriez faire:
header()
-fonction pour le faire manuellement.SET NAMES utf8
fait le tour.Vous habituellement ne pas avoir à faire trop de l'aide de l'
mb_string
ouutf8_encode/decode
-fonctions lorsque vous faites cela.Pour mieux unicode exactitude, vous devez utiliser utf8_unicode_ci (si la documentation est un peu vague sur les différences). Vous devez également vous assurer de ce qui suit Mysql drapeaux sont correctement définies -
Ceux-ci peuvent être définies dans le fichier de configuration de mysql (dans la section [mysqld] tab) ou au moment de l'exécution par l'envoi de requêtes appropriées.
Quelle que soit la langue il est écrit, si vous créez une application qui permet à un large éventail de codages, poignée en morceaux: