Utilisez toujours l'encodage UTF-8
P粉548512637
P粉548512637 2023-07-24 19:47:11
0
2
502
<p> Je configure un nouveau serveur et souhaite une prise en charge complète de l'UTF-8 dans mon application Web. J'ai déjà essayé cela sur des serveurs existants, mais il me semblait toujours devoir recourir à la norme ISO-8859-1. <br />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 à laquelle je peux me référer ou résoudre les incohérences ? <br />Il s'agit d'un nouveau serveur Linux exécutant MySQL 5, PHP 5 et Apache 2. <br /></p><p><br /></p>
P粉548512637
P粉548512637

répondre à tous(2)
P粉138871485

J'aimerais ajouter à l'excellente réponse de chazomaticus :

N'oubliez pas non plus les balises META (comme celle-ci, ou les versions HTML4 ou XHTML) :

<meta charset="utf-8">

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 manque la balise META sur la page. Après l'avoir ajouté, le problème a été résolu.


Modifier :

Le W3C dispose en effet d'une section importante dédiée aux questions d'internationalisation (I18N). Ils ont un certain nombre d'articles liés à ce problème, couvrant HTTP, (X)HTML et CSS :

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

P粉381463780

Stockage de données :

  • Spécifiez le jeu de caractères utf8mb4 sur toutes les tables et colonnes de texte de la base de données. De cette façon, MySQL stockera et récupérera physiquement la valeur dans son encodage natif UTF-8. Notez que si les classements utf8mb4_* sont spécifiés (sans aucun jeu de caractères explicite), MySQL utilisera implicitement le codage utf8mb4.

  • Dans les anciennes versions de MySQL (

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 sur utf8mb4. De cette façon, lorsque MySQL transmet les données à votre application, il n'effectue aucune conversion depuis son UTF-8 natif 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'abstraction PDO pour PHP ≥ 5.3.6, vous pouvez spécifier le jeu de caractères dans le DSN :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • Si vous utilisez MySQLi, vous pouvez appeler set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • Si vous ne pouvez utiliser que les fonctions MySQL normales, mais que vous exécutez PHP ≥ 5.2.3, vous pouvez appeler la méthode mysql_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 à MySQL comment votre application souhaite que les données sur la connexion soient codées : SET NAMES 'utf8mb4'.

  • Les mêmes considérations que ci-dessus s'appliquent à utf8mb4/utf8.

Sortie :

  • UTF-8 doit être défini dans l'en-tête HTTP, par exemple Content-Type: text/html; Vous pouvez le faire en définissant default_charset dans php.ini (de préférence) ou manuellement en utilisant la fonction 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 des métadonnées HTML).
  • Ajoutez JSON_UNESCAPED_UNICODE comme deuxième paramètre lors de l'utilisation de json_encode() pour l'encodage de sortie.

Entrée :

  • Le navigateur soumettra les données dans le jeu de caractères spécifié par le document, aucun traitement spécial n'est donc requis du côté de la saisie.
  • Si vous avez des doutes sur l'encodage de la requête (éventuellement falsifié), vous pouvez vérifier que chaque chaîne reçue est valide UTF-8 avant d'essayer de la stocker ou de l'utiliser n'importe où. Le mb_check_encoding() de PHP peut le faire, mais vous devez toujours l'utiliser. 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 fournissez (PHP, HTML, JavaScript, etc.) doivent être codés en UTF-8 valide.

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

  • Les opérations de chaîne intégrées à PHP ne prennent pas en charge UTF-8 par défaut. Il existe certaines opérations de chaîne PHP normales que vous pouvez utiliser en toute sécurité (telles que la concaténation), mais pour la plupart des opérations, vous devez utiliser les fonctions mbstring équivalentes.

  • Afin de 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 l'un des liens sur utf8.com qui fournissent d'excellentes ressources pour 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