Utilisez l'encodage UTF-8 partout
P粉557957970
P粉557957970 2023-08-27 15:50:39
0
2
426

Je configure un nouveau serveur et souhaite une prise en charge complète de l'UTF-8 dans mon application Web. J'ai essayé cela dans le passé sur des serveurs existants, mais j'ai toujours semblé devoir recourir à la norme ISO-8859-1.

Où dois-je exactement définir l'encodage/le jeu de caractères ? Je sais que je dois configurer Apache, MySQL et PHP pour ce faire. Existe-t-il une liste de contrôle standard que je peux suivre, ou peut-être résoudre les problèmes liés à l'incompatibilité ?

Cela s'applique aux nouveaux serveurs Linux exécutant MySQL 5, PHP, 5 et Apache 2.

P粉557957970
P粉557957970

répondre à tous (2)
P粉293341969

J'aimerais ajouter une choseà l'excellente réponse de 一个>chazomaticus :

N'oubliez pas non plus 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, qui fonctionne bien dans tous les autres navigateurs, mais Internet Explorer insiste toujours pour utiliser le codage "Europe occidentale".

Il s'avère qu'il manquait la balise META sur la page. L'ajouter résout le problème.

Éditeur :

Le W3C a en fait une assez grandesectiondé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 des en-têtes HTTP et des balises méta HTML (ou des déclarations XML dans le cas de XHTML agissant comme XML).

    P粉579008412

    Stockage de données:

    • Spécifiezutf8mb4字符集。这使得 MySQL 物理存储和检索以 UTF-8 原生编码的值。请注意,如果指定了utf8mb4_*排序规则(没有任何显式字符集),MySQL 将隐式使用utf8mb4l'encodage pour toutes les tables et colonnes de texte de la base de données.

    • Dans les anciennes versions de MySQL (utf8, il ne prend en charge qu'un sous-ensemble de caractères Unicode. J'aurais aimé plaisanter.

    Accès aux données:

    • Dans le code de votre application (par exemple PHP), quelle que soit la méthode d'accès à la base de données que vous utilisez, vous devez définir le jeu de caractères de connexion surutf8mb4utf8mb4

      . De cette façon, lorsque MySQL transmet des données à votre application, elle ne convertit pas depuis son UTF-8 natif ou 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 :
      $dbh = new PDO('mysql:charset=utf8mb4');
    • Si vous utilisezmysqli, vous pouvez appelerset_charset()set_charset()

    • :
    • $mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style

      Si vous insistez pour utilisermysqlsimple mais que vous exécutez PHP ≥ 5.2.3, vous pouvez appeler 代码>mysql_set_charset

    • .
  • 设置名称'utf8mb4'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 à MySQL comment votre application s'attend à ce que les données sur la connexion soient codées :

    Définissez le nom 'utf8mb4'
  • .

    utf8mb4/utf8

  • Les mêmes considérations s'appliquent pour utf8mb4

    /utf8comme mentionné ci-dessus.

    Sortie :
    • UTF-8 doit être défini dans l'en-tête HTTP, comme la fonctionContent-Type:text/html;字符集=utf-8。您可以通过设置default_charset code>在 php.ini 中(首选),或手动使用header().
    • Si votre application transfère du texte vers d'autres systèmes, ils devront également connaître le codage des caractères. Pour les applications Web, il faut indiquer au navigateur l'encodage dans lequel envoyer les données (via les en-têtes de réponse HTTP ou lesmétadonnées HTML).
    • Utilisezjson_encode()对输出进行编码时,添加JSON_UNESCAPED_UNICODEcomme deuxième paramètre.

    Entrez:

    • Le navigateur soumettra les données pour le jeu de caractères spécifié par le document, il n'est donc pas nécessaire d'effectuer des opérations spéciales sur l'entrée.
    • 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ù. PHPmb_check_encoding()fait ce qui suit : des astuces, mais vous devez l'utiliser religieusement. 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 codés en UTF-8 valide.

    • Vous devez vous assurer que vous êtes en sécurité chaque fois que vous manipulez des chaînes UTF-8. Malheureusement, c'est la partie la plus difficile. Vous souhaiterez peut-être utiliser largement l'extensionmbstringde PHP.

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

    • Pour savoir ce que vous faites (lire : ne pas tout gâcher), vous devez vraiment comprendre UTF-8 et comment il fonctionne au niveau le plus bas possible. Consultez l'un des liens surutf8.compour accéder à d'excellentes ressources sur tout ce que vous devez savoir. p>

      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!