2009-10-22 5 views
16

Quels extensions recommanderiez-vous et comment devraient php être mieux configuré pour créer un site Web qui utilise pour tout encodage utf-8. par exemple ...Comment mieux configurer PHP pour gérer un site web UTF-8

  • page sortie est UTF-8
  • formes soumettent des données codées dans utf-8
  • traitement interne des données de chaîne (par exemple, lorsque l'on parle à une base de données) sont tous en utf-8 bien.

Il semble que php ne gère pas vraiment bien les jeux de caractères multi-octets pour le moment. Jusqu'à présent, j'ai travaillé que mbstring ressemble à une extension importante.

Cela vaut-il la peine ..?

+0

J'ai utilisé avec succès des installations PHP standard avec des fichiers sources UTF-8 générant des sorties UTF-8 incluant des caractères spéciaux UTF-8 comme ♕ ⚐ et ✔ depuis 4.1.x. :) – Pascal

+0

Obtenir une sortie UTF-8 correcte ne prouve pas que votre code analyse correctement ** input ** et qu'il est protégé contre les séquences malveillantes. – Pacerier

+0

** Mise à jour ** Tout au long de ce Q & A, pensez à utiliser 'utf8mb4' dans MySQL au lieu de' utf8'. (Contraste, le terme non-MySQL 'UTF-8'.) –

Répondre

46

Les problèmes supposés de PHP avec le contenu Unicode ont été quelque peu surestimés. Je fais des sites Web multilingues depuis 1998 et je n'ai jamais su qu'il pourrait y avoir un problème avant d'en avoir lu quelque part - de nombreuses années et sites Web plus tard.

Cela fonctionne très bien pour moi:

configuration Apache (dans httpd.conf ou .htaccess)

AddDefaultCharset utf-8 

PHP (en php.ini)

default_charset = "utf-8" 
mbstring.internal_encoding=utf-8 
mbstring.http_output=UTF-8 
mbstring.encoding_translation=On 
mbstring.func_overload=6 

MySQL

CREATE votre base de données avec une collation utf8_*, laisser les tables héritent de la collation de base de données et commencent chaque connexion avec "SET NAMES utf8"

HTML (dans l'élément HEAD)

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+0

Que fait réellement l'instruction SQL" SET NAMES utf8 "? –

+1

Directement à partir des documents MySQL: "Une instruction SET NAMES 'x' est équivalente à ces trois instructions: SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;" Ceci est pratique car quel que soit le jeu de caractères que vous utilisez pour stocker les données, les données doivent toujours voyager vers et depuis PHP. On pourrait ne jamais remarquer un problème en utilisant un seul ordinateur (comme dans HTML FORM -> MySQL -> page), mais en utilisant une machine de développement pour remplir un db et le déplacer vers le serveur prod pour le sortir est risqué, car les deux peuvent bien avoir différents charsets client. SET NAMES signifie portabilité. – djn

+0

Pouvez-vous encore utiliser les fonctions de chaîne de PHP ou vous devez utiliser ceux de 'mb_'? –

1

Si mbstring ne fait pas déjà partie de votre paquet PHP, alors je vous le recommande certainement - vous aurez même envie de l'utiliser pour calculer les longueurs de chaînes (mb_strlen ($ string_var, 'utf8')) pour la forme input ... Sinon vous n'aurez besoin de rien d'autre que du code HTML valide et correct, une configuration http-server correcte (pour que le serveur délivre les pages utf-8) et un éditeur de texte avec utf-8-support (par exemple Notepad ++).

1

Dans votre php.ini, définissez

mbstring.internal_encoding = UTF-8 
mbstring.encoding_translation = On 

afin que vous n'avez pas besoin de passer un paramètre de codage aux fonctions MB_ chaque fois.

2

php s'en sort très bien!

Vous devez définir le paramètre php.ini "default_charset" à 'utf-8'.

Le assurez-vous que: -

<head> 
    <meta http-equiv="Content-Type" 
    content="text/html; charset=utf-8" 
    /> 

est en haut de chaque page que vous servez.

Il y a quelques zones problématiques:

Bases de données - assurez-vous qu'ils sont configurés pour utiliser utf-8 par défaut ou entrer dans un monde de douleur.

/IDEs éditeurs - beaucoup d'éditeurs DonT soutien utf-8 bien. J'utilise normalement vim qui ne le fait pas mais ça n'a jamais été un gros problème.

Documents - venons juste de passer un après-midi se php pour lire cahracters thai sur une feuille de calcul. J'ai finalement réussi mais je ne suis toujours pas sûr de ce que j'ai bien fait.

3

J'étais confronté au même problème pour UTF-8 characters, Tout fonctionnait sur le serveur live et le serveur de transfert, mais parfois, il se brise sur ma machine dev. Le comportement était si étrange, certains caractères fois été codés correctement, mais à la page au hasard reload il a été commencer rupture avec Diamond Charters'���เห็นอเวิลด์!���' ou Question mark'??�เห็นอเวิลด์!???' ou des données de 85% a été le rendu correctement 'เห็นอเวิลด์!?��' mais reposer 15% montrait des personnages inégalés. Je cherchais à résoudre le problème.Alors, a commencé avec ma liste de contrôle

1 - Vérifier si le caractère en-tête Ajouté en HTML


2 - Vérifiez si les données correctes enregistrées dans le tableau MySQL


3 - Vérifiez si MySQL a des paramètres appropriés de codage pour UTF-8


4 - Vérifiez si Apache a Configuration de traiter UTF-8 Jeu de caractères


5 - Vérifiez si PHP simple peut echo "เห็น อ เวิลด์" sortie même en entrée "เห็น อ เวิลด์"


6 - Vérifiez si PHP envoyer une bonne sortie en-têtes


7 - Vérifiez si la requête MySQL g ise mêmes données "เห็น อ เวิลด์"


8 - Vérifiez si "เห็น อ เวิลด์" a quelques caractères html, les traiter correctement


9 - Vérifier si "เห็น อ เวิลด์" passant par un ny encode html decode fonction


10- Vérifiez si .htaccess prêt à traiter avec caractères UTF-8


Vérifiez tout ce qui précède liste pour comprendre où quelque chose .. rupture.

donner un essai (j'utilise Codeigniter):

================================= 
:: PHP ini Settings:: 
================================= 

default_charset = "utf-8" 
mbstring.internal_encoding=utf-8 
mbstring.http_output=UTF-8 
mbstring.encoding_translation=On 
mbstring.func_overload=6 

================================= 
:: .htaccess Settings:: 
================================= 

DefaultLanguage en-US 
AddDefaultCharset UTF-8 

================================= 
:: HTML Header Page:: 
================================= 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

================================= 
:: PHP Codeigniter index.php :: 
================================= 

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

================================= 
:: Codeigniter config.php :: 
================================= 

$config['charset'] = 'UTF-8'; 

================================= 
:: Codeigniter database.php :: 
================================= 

$db['default']['char_set'] = 'utf8'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 

================================= 
:: Codeigniter helper function (optional) 
================================= 

if(!function_exists('safe_utf_string')){ 
    function safe_utf_string($utf8string= ''){ 
     $utf8string = htmlspecialchars($utf8string, ENT_QUOTES, 'UTF-8'); 
     return mb_convert_encoding($utf8string, 'UTF-8'); 
    } 
} 

et enfin ne pas oublier de dire Merci! :) à @djn

+0

Vous pouvez avoir besoin de 'utf8mb4' au lieu de' utf8' dans MySQL. Pouvez-vous fournir l'hexagone pour les personnages devenus des diamants noirs? Ou les personnages qu'ils auraient dû être là? Quand l'hex est 4 octets: 'F0xxyyzz', utf8 ne suffira pas; utf8mb4 est requis. –

Questions connexes