"Débloqué : le chemin vers UTF-8"
P粉291886842
P粉291886842 2023-08-21 21:18:02
0
2
478

Je configure un nouveau serveur et souhaite une prise en charge complète du codage UTF-8 dans mon application Web. J'ai déjà essayé cela sur des serveurs existants, mais j'ai toujours dû recourir au codage ISO-8859-1.

Où dois-je définir l'encodage/le jeu de caractères ? Je sais que je dois configurer Apache, MySQL et PHP pour y parvenir. Existe-t-il une liste de contrôle standard que je peux suivre ou une méthode de dépannage permettant de résoudre les incohérences ?

Il s'agit d'un nouveau serveur Linux exécutant MySQL 5, PHP 5 et Apache 2.

P粉291886842
P粉291886842

répondre à tous (2)
P粉184747536

Je voudrais ajouter à l'excellente réponse dechazomaticus:

N'oubliez pas la balise META (comme celle-ci, ousa version HTML4 ou XHTML) :

Cela peut sembler trivial, mais IE7 m'a déjà posé des problèmes.

Je fais tout correctement ; la base de données, la connexion à la base de données et les en-têtes HTTP Content-Type sont tous définis sur UTF-8 et fonctionnent correctement dans tous les autres navigateurs, mais Internet Explorer insiste toujours pour utiliser le codage "Europe occidentale".

Il s'est avéré qu'il manquait la balise META sur la page. Le problème a été résolu après l'avoir ajouté.

Éditeur :

En fait, le W3C possède unesectionassez importante dédiée à l'I18N. Ils ont un certain nombre d'articles liés à ce problème - décrivant des aspects de HTTP, (X)HTML et CSS :

Ils recommandent d'utiliser à la fois les en-têtes HTTP et les balises méta HTML (ou les déclarations XML dans le cas du XHTML fourni au format XML).

    P粉032977207

    Stockage de données:

    • Spécifiezutf8mb4字符集。这使得MySQL在物理上存储和检索以UTF-8编码的值。请注意,如果指定了utf8mb4_*校对(没有任何显式字符集),MySQL将隐式使用utf8mb4encoding sur toutes les tables et colonnes de texte de la base de données.

    • Dans les anciennes versions de MySQL (utf8 qui ne prend en charge qu'un sous-ensemble de caractères Unicode. J'espère que je plaisante.

    Accès aux données:

    • Dans le code d'application (par exemple PHP), vous devez définir le jeu de caractères de connexion surutf8mb4quelle que soit la méthode d'accès à la base de données utilisée. De cette façon, MySQL n'effectue aucune conversion depuis son UTF-8 natif lors de la transmission des données à l'application et vice versa.

    • Certains pilotes fournissent leur propre mécanisme de configuration du jeu de caractères de connexion, qui met à jour son propre état interne et informe MySQL de l'encodage à utiliser sur la connexion - c'est généralement l'approche préférée. En PHP :

      • Si vous utilisez la couche d'abstractionPDOpour PHP ≥ 5.3.6, vous pouvez spécifierdans leDSNcharset:

        $dbh = new PDO('mysql:charset=utf8mb4');
      • Si vous utilisezmysqli, vous pouvez appelerset_charset():

        $mysqli->set_charset('utf8mb4'); // 面向对象风格 mysqli_set_charset($link, 'utf8mb4'); // 过程化风格
      • Si vous êtes bloqué dansmysqlpur mais que vous utilisez PHP ≥ 5.2.3, vous pouvez appelermysql_set_charset.

    • Si le pilote ne fournit pas son propre mécanisme pour définir le jeu de caractères de connexion, vous devrez peut-être émettre une requête pour indiquer à l'application MySQL quel encodage attendre les données sur la connexion :SET NAMES 'utf8mb4'.

    • Les mêmes considérations concernantutf8mb4/utf8/

      que ci-dessus s'appliquent ici.

    Sortie

    :
    • UTF-8 doit être défini dans l'en-tête HTTP, par exemple par la fonctionContent-Type: text/html; charset=utf-8。您可以通过在php.ini中设置default_charset(首选)或手动使用header().
    • Si votre application transfère du texte vers d'autres systèmes, ils doivent également connaître le codage des caractères. Pour les applications web, le navigateur doit être informé du codage dans lequel les données sont envoyées (via des en-têtes de réponse HTTP ou desmétadonnées HTML).
    • est ajouté en utilisantjson_encode()对输出进行编码时,将JSON_UNESCAPED_UNICODEcomme deuxième paramètre.

    Entrez:

    • Le navigateur soumettra les données selon le jeu de caractères spécifié par le document, aucun traitement spécial n'est donc requis lors de la saisie.
    • Si vous avez des doutes sur l'encodage de la requête (au cas où elle aurait été falsifiée), vous pouvez vérifier que chaque chaîne reçue est UTF-8 valide avant d'essayer de la stocker ou de l'utiliser n'importe où. Les PHPmb_check_encoding()peuvent résoudre ce problème, mais vous devez l'utiliser strictement. Il n'y a vraiment aucun moyen de contourner ce problème, car un client malveillant peut soumettre des données dans le codage de son choix, et je n'ai pas trouvé d'astuce pour que PHP le fasse de manière fiable pour vous.

    Autres notes de code:

    • Évidemment, tous les fichiers que vous fournirez (PHP, HTML, JavaScript, etc.) doivent être encodés en UTF-8 valide.

    • Vous devez vous assurer de le faire en toute sécurité chaque fois que vous manipulez des chaînes UTF-8. C'est la partie la plus difficile. Vous devrez peut-être utiliser largement l'extensionmbstringde PHP.

    • Les opérations de chaîne intégrées à PHP ne sont pas sécurisées UTF-8 par défaut.Vous pouvez effectuer en toute sécurité certaines opérations en utilisant des opérations de chaîne PHP normales telles que la concaténation, mais pour la plupart des opérations, vous devez utiliser les fonctionsmbstringéquivalentes.

    • Pour savoir ce que vous faites (c'est-à-dire ne pas vous tromper), vous devez vraiment comprendre UTF-8 et comment il fonctionne au niveau le plus bas. Consultez n’importe quel lien surutf8.compour apprendre tout ce que vous devez savoir.

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!