1335 votes

UTF-8 tout au long de

Je suis la mise en place d'un nouveau serveur, et que vous voulez le soutien de l'UTF-8 entièrement dans mon application web. J'ai essayé dans le passé sur des serveurs existants et semblent toujours avoir à revenir à la norme ISO-8859-1.

Où exactement, ai-je besoin pour définir l'encodage/jeux de caractères? Je suis conscient que j'ai besoin de configurer Apache, MySQL et PHP pour faire cela - est-il une liste de contrôle standard je peux suivre, ou peut-être à résoudre lorsque la situation se produit?

C'est pour un nouveau serveur Linux, sous MySQL 5, PHP 5 et Apache 2.

1126voto

chazomaticus Points 4496

Stockage De Données:

  • Spécifiez l' utf8mb4 jeu de caractères sur toutes les tables et colonnes de texte dans votre base de données. Cela rend MySQL physiquement stocker et récupérer des valeurs codées en mode natif en UTF-8. Notez que MySQL utilisent implicitement utf8mb4 encodage si un utf8mb4_* classement est spécifié (sans aucune explicite jeu de caractères).

  • Dans les anciennes versions de MySQL (< 5.5.3), vous aurez malheureusement obligés de l'utiliser simplement en utf8, qui ne prend en charge un sous-ensemble de caractères Unicode. Je souhaite que j'étais une blague.

Accès Aux Données:

  • Dans le code de votre application (par exemple PHP), quelle que soit la DB méthode d'accès que vous utilisez, vous devez définir la connexion charset utf8mb4. De cette façon, MySQL n'a pas de conversion de ses natif de l'UTF-8 quand il remet les données à votre application et vice versa.

  • Certains pilotes de fournir leur propre mécanisme pour la configuration de la connexion du jeu de caractères, qui à la fois les mises à jour de son propre état interne et en informe MySQL de l'encodage à utiliser pour la connexion, ce qui est habituellement la meilleure approche. En PHP:

    • Si vous êtes à l'aide de l' AOP de la couche d'abstraction avec PHP ≥ 5.3.6, vous pouvez spécifier charset dans la DSN:

      $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Si vous êtes à l'aide de mysqli, vous pouvez appeler set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Si vous êtes coincé avec du mysql , mais arriver à être en cours d'exécution PHP ≥ 5.2.3, vous pouvez appeler mysql_set_charset.

  • Si le pilote ne fournit pas son propre mécanisme de réglage de la connexion du jeu de caractères, vous pouvez avoir à émettre une requête de dire à MySQL comment votre application attend de données sur la connexion à encoder: SET NAMES 'utf8mb4'.

  • La même considération en ce qui concerne utf8mb4/utf8 s'applique comme ci-dessus.

Sortie:

  • Si votre application transmet le texte à d'autres systèmes, ils doivent également être informés de l'encodage des caractères. Avec les applications web, le navigateur doit être informé de l'encodage dans lequel les données sont envoyées (par le biais de la réponse HTTP en-têtes ou des métadonnées HTML).

  • En PHP, vous pouvez utiliser l' default_charset php.option ini, ou manuellement à l' Content-Type d'en-tête MIME vous-même, ce qui est juste plus de travail, mais a le même effet.

Entrée:

  • Malheureusement, vous devez vérifier chaque chaîne reçue comme UTF-8 valide avant d'essayer de les stocker ou de les utiliser n'importe où. PHP mb_check_encoding() fait le tour, mais vous devez utiliser religieusement. Il n'y a vraiment aucun moyen de contourner cela, comme malveillants, les clients peuvent soumettre des données quel que soit l'encodage qu'ils veulent, et je n'ai pas trouvé une astuce pour obtenir le PHP pour le faire pour vous de manière fiable.

  • De ma lecture de l'actuel spécification HTML, le sous-balles ne sont pas nécessaires ou même plus valable pour les modernes de HTML. Ma compréhension est que les navigateurs vont travailler avec et de soumettre des données dans le jeu de caractères spécifiée dans le document. Toutefois, si vous ciblez les anciennes versions de HTML (XHTML, HTML4, etc.), ces points peuvent encore être utiles:

    • Pour le HTML avant de le HTML5 uniquement: vous voulez que toutes les données envoyées par les navigateurs pour être en UTF-8. Malheureusement, si vous passez par la le seul moyen fiable de le faire est d'ajouter l' accept-charset d'attribut pour tous vos <form> tags: <form ... accept-charset="UTF-8">.
    • Pour le HTML avant de le HTML5 seulement: notez que le W3C HTML spec dit que les clients "doivent" par défaut pour l'envoi des formulaires sur le serveur dans quel jeu de caractères du serveur servi, mais ce n'est apparemment qu'une recommandation, d'où la nécessité d'être explicite sur chaque <form> balise.

Autres Code Considérations:

  • Bien évidemment, tous les fichiers que vous allez servir (PHP, HTML, JavaScript, etc.) doit être encodé en UTF-8 valide.

  • Vous devez vous assurer que chaque fois que vous traitez une chaîne UTF-8, vous le faites en toute sécurité. C'est, malheureusement, la partie la plus difficile. Vous aurez probablement envie de faire un large usage de PHP mbstring extension.

  • PHP intégré dans les opérations de la chaîne sont pas par défaut UTF-8 en sécurité. Il y a certaines choses que vous pouvez faire en toute sécurité avec PHP normal des opérations de chaîne (comme la concaténation), mais pour la plupart des choses que vous devriez utiliser l'équivalent mbstring fonction.

  • Pour savoir ce que vous êtes en train de faire (lire: à ne pas louper), vous avez vraiment besoin de savoir l'UTF-8 et la façon dont il fonctionne sur le plus bas niveau possible. Découvrez tous les liens de utf8.com pour quelques bonnes ressources pour apprendre tout ce que vous devez savoir.

167voto

mercator Points 16196

Je tiens à ajouter une chose à chazomaticus " excellente réponse:

N'oubliez pas la balise META (comme ça, ou le HTML4 ou XHTML version de celui-ci):

<meta charset="utf-8">

Cela semble trivial, mais IE7 m'a donné des problèmes avec ça.

Je faisais tout droit; la base de données, de connexion de base de données et le Type de Contenu d'en-tête HTTP ont été tous mis en UTF-8, et il a bien fonctionné dans tous les autres navigateurs, mais Internet Explorer toujours insisté sur l'utilisation de l' "europe Occidentale" encoding.

Il s'est avéré que la page qu'il manquait la balise META. L'ajout qui a résolu le problème.

Edit:

Le W3C a fait une assez grande section dédiée à l'I18N. Ils ont un certain nombre d'articles liés à cette question – description du HTTP, (X)HTML et CSS côté des choses:

Ils vous recommandons d'utiliser à la fois l'en-tête HTTP et HTML de la balise meta (ou déclaration XML en cas de XHTML servi en tant que XML).

72voto

Christopher Nadeau Points 2246

Outre la définition de l' default_charset en php.ini, vous pouvez envoyer le bon jeu de caractères à l'aide de header() à partir de votre code, avant toute sortie:

header('Content-Type: text/html; charset=utf-8');

Travailler avec Unicode en PHP est facile aussi longtemps que vous vous rendez compte que la plupart des fonctions de chaîne ne fonctionne pas avec l'Unicode, et certains pourraient mutilation des chaînes complètement. PHP considère "caractères" à 1 de l'octet de long. Parfois, ce n'est pas grave (par exemple, explode() recherche uniquement une séquence d'octets et l'utilise comme un séparateur -- donc il n'a pas d'importance réelle de caractères que vous recherchez). Mais d'autres fois, lorsque la fonction est en fait conçu pour le travail sur les personnages, PHP n'a aucune idée de ce que votre texte a des caractères multi-octets qui sont disponibles avec Unicode.

Une bonne bibliothèque pour vérifier en est phputf8. Cette réécrit tous les "mauvais" fonctions de sorte que vous pouvez travailler en toute sécurité sur les chaînes de caractères UTF8. Il y a des extensions comme l'extension mbstring que d'essayer de le faire pour vous, aussi, mais je préfère utiliser la bibliothèque parce que c'est plus portable (mais j'écris des produits de masse, il est donc important pour moi). Mais phputf8 pouvez utiliser mbstring derrière les scènes, de toute façon, pour augmenter les performances.

42voto

Brad F Jacobs Points 12725

Vieux sujet, je sais. Trouvé un problème avec quelqu'un en utilisant PDO et la réponse a été d’utiliser cela pour la chaîne de connexion PDO :

Le site j’ai pris cette d’est en panne, a été en mesure d’obtenir à l’aide de google cache heureusement.

29voto

JDelage Points 2346

Dans mon cas, j’ai été en utilisant , qui utilise la regex. C’est pourquoi j’ai dû également manuellement, assurez-vous que l’encodage de regex est utf-8 par la pratique

Comme note latérale, j’ai aussi découvert en exécutant que l’encodage interne n’était pas utf-8, et j’ai changé cela en exécutant .

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