web-dev-qa-db-fra.com

Comment mieux configurer PHP gérer un site web UTF-8

Quelles extensions recommanderiez-vous et comment PHP devrait-il être configuré de manière à créer un site Web utilisant l'encodage utf-8 pour tout? par exemple...

  • La sortie de page est utf-8
  • les formulaires soumettent des données encodées en utf-8
  • le traitement interne des données de chaîne (par exemple, lorsqu’on parle à une base de données) s’inscrit également dans utf-8.

Il semble que php ne supporte pas vraiment bien les jeux de caractères multi-octets pour le moment. Jusqu'ici, j'ai déterminé que mbstring ressemble à une extension importante.

Vaut-il la peine ..?

17
Rik Heywood

Les supposés problèmes de PHP avec du contenu Unicode ont été quelque peu surestimés. Je fais des sites Web multilingues depuis 1998 et je ne savais pas qu'il pourrait y avoir un problème avant d'en avoir pris connaissance quelque part, de nombreuses années 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 un classement utf8_*, laissez les tables hériter du classement de la base de données et démarrez chaque connexion avec "SET NAMES utf8"

HTML (dans l'élément HEAD)

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

Je faisais face au même problème pour UTF-8 characters: tout fonctionnait sur le serveur actif et le serveur intermédiaire, mais parfois, cela se produisait sur ma machine de développement. Le comportement était si étrange que, parfois, les caractères étaient codés correctement, mais lors du rechargement aléatoire de la page, il était en train de rompre avec Diamond Charters'���เห็นอเวิลด์!���'ou Question mark'??�เห็นอเวิลด์!???'ou 85% des données étaient restituées correctement'เห็นอเวิลด์!?��'mais le reste 15% affichait des caractères incomparables. Je cherchais à résoudre le problème. Donc, a commencé avec ma liste de contrôle

1 - Vérifie si l'en-tête de caractère est ajouté en HTML


2 - Vérifie si les données appropriées sont enregistrées dans la table MySQL


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


4 - Vérifier si Apache a paramétré pour traiter le jeu de caractères UTF-8


5 - Vérifie si un simple PHP peut faire écho à "อ output" le même résultat que l'entrée "อ เวิลด์"


6 - Vérifie si PHP envoie le bon résultat d'en-tête


7 - Vérifie si MySQL Query obtient les mêmes données "เห็น อ เวิลด์"


8 - Vérifier si "เห็น" a des caractères HTML, les traiter correctement


9 - Vérifier si "" passe par une fonction de décodage HTML


10- Vérifier si .htaccess est configuré pour traiter le jeu de caractères UTF-8


Vérifiez toute la liste ci-dessus pour savoir où quelque chose… se brise.

Faites 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 n'oubliez pas de dire merci! :) à@djnrépondre

3
Neeraj Singh

php se débrouille très bien!

Vous devez définir le paramètre "default_charset" de php.ini sur "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 problèmes:

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.

IDE/Editors - de nombreux éditeurs ne supportent pas bien utf-8. J'utilise normalement vim qui ne le fait pas, mais cela n'a jamais été un gros problème.

Documents - Je viens de passer tout un après-midi à faire lire par PHP les caractères thaïlandais sur un tableur. J'ai finalement réussi mais je ne suis toujours pas sûr de ce que j'ai bien fait.

2
James Anderson

Si mbstring ne fait pas déjà partie de votre paquet PHP, je vous le recommande vivement - vous voudrez même l'utiliser pour les longueurs de chaîne de calcul (mb_strlen ($ string_var, 'utf8')) pour la saisie de formulaire ... Sinon, vous n'aurez besoin de rien sauf d'un code HTML valide et correct, d'un config http-serveur correct (pour que le serveur fournisse des pages avec la commande utf-8) et d'un éditeur de texte avec utf- 8-support (par exemple Notepad ++).

1
RSeidelsohn

Dans votre php.ini, définissez

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

afin que vous n'ayez pas besoin de passer un paramètre de codage aux fonctions mb_ à chaque fois.

1
Ben James

Mise à jour 2018 :::

Veuillez bien noter que ces entrées php.ini sont DEPRECATED;

;mbstring.internal_encoding = utf-8
;mbstring.http_input =
;mbstring.http_output = utf-8

La définition de default_charset est suffisante.

 default_charset = "UTF-8"
0
MarcoZen