Maison  >  Article  >  développement back-end  >  Comment résoudre le code PHP chinois tronqué ? Introduction à trois situations de caractères chinois tronqués en PHP

Comment résoudre le code PHP chinois tronqué ? Introduction à trois situations de caractères chinois tronqués en PHP

不言
不言original
2018-07-23 16:44:1314225parcourir

Les caractères chinois PHP tronqués sont un problème qui peut souvent être rencontré dans le développement PHP. Par exemple : les caractères chinois PHP tronqués apparaissent parfois sur la page Web elle-même, certains surviennent lors de l'interaction avec MySQL et sont parfois liés au système d'exploitation. . Alors, comment résoudre le code chinois tronqué en PHP ? Examinons ensuite ces trois situations en détail.

Manuel recommandé  : manuel d'auto-apprentissage complet en php

1. Le premier est l'encodage de la page Web PHP

1 L'encodage du fichier php lui-même et l'encodage de la page Web doivent correspondre

a. encodage gb2312, alors php doit afficher l'en-tête : header( "Content-Type: text/html; charset=gb2312"), ajouter fa550bc3e850671b5f9dec46a6d29399 sur la page statique et que le format d'encodage de tous les fichiers est ANSI, vous pouvez l'ouvrir avec le Bloc-notes, l'enregistrer sous et sélectionner l'encodage au format ANSI, et écraser le fichier source.

b. Si vous souhaitez utiliser l'encodage utf-8, alors php doit afficher l'en-tête : header("Content-Type: text/html; charset=utf-8") et ajouter 835278d1e374487dac632d12ed14d6aa, le format d'encodage de tous les fichiers est utf-8. L'enregistrement au format utf-8 peut être un peu gênant. Généralement, les fichiers utf-8 auront une nomenclature au début. Si vous utilisez une session, il y aura des problèmes. Vous pouvez utiliser editplus pour enregistrer. Sélection des paramètres->Fichier-> Signature UTF-8, sélectionnez Toujours supprimer, puis enregistrez pour supprimer les informations de nomenclature.

2. PHP lui-même n'est pas Unicode, toutes les fonctions telles que substr doivent être modifiées en mb_substr (l'extension mbstring doit être installée ou iconv peut être utilisée pour transcoder) ;

2. Interaction des données entre PHP et Mysql

L'encodage de PHP et de la base de données doit être cohérent

1 Modifier le fichier de configuration mysql my.ini ou my.cnf. utilisez l'encodage utf8 pour mysql

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
在[mysqld]下加入:
default-collation=utf8_bin
init_connect='SET NAMES utf8'

2. Ajoutez mysql_query("set names" avant le programme PHP qui doit effectuer les opérations de base de données. 'Encoding'");, l'encodage est cohérent avec l'encodage PHP. Si l'encodage PHP est gb2312, alors l'encodage mysql est gb2312. S'il est utf-8, alors l'encodage mysql est utf8, afin qu'il n'y ait pas de caractères tronqués lors de l'insertion ou de la récupération de données

3. PHP est lié au système d'exploitation

L'encodage de Windows et Linux est différent Dans l'environnement Windows, lors de l'appel de fonctions PHP, si les paramètres sont encodés en utf-8, des erreurs se produiront, telles que. move_uploaded_file(), filesize(), readfile(), etc. Ces fonctions sont souvent utilisées lors du traitement des téléchargements et des téléchargements. Ce qui suit peut se produire lors de l'appel. Les erreurs ci-dessus :

Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in ...
Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move '' to '' in ...
Warning: filesize() [function.filesize]: stat failed for ... in ...
Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..

Bien que ces erreurs ne se produisent pas lors de l'utilisation de l'encodage gb2312 dans un environnement Linux, le nom du fichier enregistré sera tronqué et le fichier ne pourra pas être lu. Dans ce cas, les paramètres peuvent être tronqués. converti en numéro d'identification du système d'abord. code, la conversion d'encodage peut utiliser mb_convert_encoding (chaîne, nouvel encodage, encodage d'origine) ou iconv (encodage d'origine, nouvel encodage, chaîne), de sorte que le nom de fichier enregistré après le traitement soit Il n'y aura pas de caractères tronqués, les fichiers pourront être lus normalement et les fichiers portant des noms chinois pourront être téléchargés.

En fait, il existe une meilleure solution, complètement déconnectée du système, et il n'est pas nécessaire de considérer l'encodage du système. Vous pouvez générer une séquence composée uniquement de lettres et de chiffres comme nom de fichier et enregistrer le nom d'origine avec des caractères chinois dans Dans la base de données, il n'y aura aucun problème lors de l'appel de move_uploaded_file() Lors du téléchargement, il vous suffit de remplacer le nom du fichier par le nom d'origine avec des caractères chinois.

Le code pour implémenter le téléchargement est le suivant

header("Pragma: public");
header("Expires: 0");
header("Cache-Component: must-revalidate, post-check=0, pre-check=0");
header("Content-type: $file_type");
header("Content-Length: $file_size");
header("Content-Disposition: attachment; filename=\"$file_name\"");
header("Content-Transfer-Encoding: binary");
readfile($file_path);

$file_type est le type de fichier, $file_name est le nom d'origine et $file_path est l'adresse du fichier enregistré sur le service.

4. Résumons pourquoi les caractères tronqués apparaissent

De manière générale, il y a deux raisons à l'apparition de caractères tronqués. La première est due à l'encodage (charset). Les paramètres sont incorrects, ce qui entraîne l'analyse du navigateur avec un mauvais encodage, ce qui entraîne un "livre céleste" désordonné remplissant l'écran. Deuxièmement, le fichier est ouvert avec un mauvais encodage, puis enregistré. Par exemple, un fichier texte a été initialement enregistré. Il est codé en GB2312, mais il est ouvert et enregistré en codage UTF-8. Pour résoudre le problème de code tronqué ci-dessus, vous devez d'abord savoir quels aspects du développement impliquent l'encodage :

1 Encodage du fichier :

fait référence au fichier d'échange (.html, .php, etc. .) lui-même. Quel encodage est utilisé pour l'enregistrer.

Bloc-notes et Dreamweaver L'encodage du fichier sera automatiquement reconnu à l'ouverture de la page, il n'y aura donc aucun problème. Cependant, ZendStudio ne reconnaît pas automatiquement l'encodage. Il ouvrira uniquement le fichier dans un certain encodage basé sur la configuration des préférences. J'ai accidentellement ouvert le fichier avec un mauvais encodage pendant que je travaillais, et après avoir effectué les modifications, dès que je l'ai enregistré, des caractères tronqués sont apparus (je le sais très bien).

2. Encodage de la déclaration de page :

Dans le code HTML HEAD, vous pouvez utiliser cd7a33a396fd8c7cd5dc7f918bc3cf93 Pour indiquer au navigateur quel encodage est utilisé pour la page Web, XXX utilise actuellement principalement GB2312 et UTF-8 dans le développement de sites Web chinois.

3. Encodage de connexion à la base de données :

fait référence à l'encodage utilisé pour transmettre les données à la base de données lors de l'exécution d'opérations de base de données. Ce qu'il faut noter ici, c'est de ne pas le confondre avec l'encodage de la base de données elle-même, comme l'encodage par défaut interne de MySQL. Il s'agit d'un codage latin1, ce qui signifie que Mysql stocke les données en codage latin1 et que les données transmises à Mysql dans d'autres codages seront converties en codage latin1.

En sachant où le codage est impliqué dans le développement WEB, vous connaissez également la cause des codes tronqués : les trois paramètres de codage ci-dessus sont incohérents. Étant donné que la plupart des différents codages sont compatibles ASCII, les symboles anglais ne seront pas compatibles. n'apparaît pas, et le chinois n'a pas de chance.

5. Combattez certaines situations d'erreur courantes et solutions :

1. La base de données utilise le codage UTF8 et le codage de la déclaration de page est GB2312. , qui est la cause la plus courante de caractères tronqués.

À ce stade, si vous SÉLECTIONNEZ directement les données dans le script PHP, les données seront tronquées. Vous devez les utiliser avant d'interroger : mysql_query("SET. NAMES GBK"); pour définir l'encodage de la connexion MYSQL et garantir que l'encodage de la déclaration de page est cohérent avec l'encodage de la connexion défini ici (GBK est une extension de GB2312 ).

Si la page est encodée en UTF-8, vous pouvez utiliser : mysql_query("SET NAMES UTF8");
Notez qu'il s'agit d'UTF8 au lieu de l'UTF-8 couramment utilisé.

Si l'encodage déclaré sur la page est cohérent avec l'encodage interne de la base de données, vous n'avez pas besoin de paramétrer l'encodage de connexion.

Remarque :

En fait, l'entrée et la sortie des données de MYSQL sont plus compliquées que ce qui est mentionné ci-dessus. Il y a 2 encodages par défaut définis dans le fichier de configuration MYSQL. my.ini, respectivement. Il se trouve dans [client]. jeu de caractères par défaut et jeu de caractères par défaut dans [mysqld] Pour définir l'encodage utilisé par défaut pour les connexions client et les bases de données internes respectivement.

L'encodage que nous avons spécifié ci-dessus est en fait le paramètre de ligne de commande lorsque le client MYSQL se connecte au serveur. Character_set_client, pour indiquer au serveur MYSQL quel est l'encodage des données client reçues, au lieu d'utiliser l'encodage par défaut.

2. L'encodage de la déclaration de page est incohérent avec l'encodage du fichier lui-même, car si l'encodage est incohérent, ce que l'artiste voit dans le navigateur lors de la création de la page sera des caractères tronqués. Le plus souvent, il est modifié après publication. Certains bugs mineurs sont causés par l'ouverture de la page avec un mauvais encodage, puis par son enregistrement.

Ou utilisez un logiciel FTP pour modifier directement les fichiers en ligne, tel que CuteFTP. En raison d'une configuration d'encodage logiciel incorrecte, la conversion sera erronée. code.

3. Certains amis qui louent des hôtes virtuels, même si les trois encodages ci-dessus sont correctement définis, il y a toujours des caractères tronqués. Par exemple, la page Web est GB2312 Encodé, IE et les autres navigateurs le reconnaissent toujours comme UTF-8 à l'ouverture. La page HEAD a déclaré qu'il s'agit de GB2312. Modifiez manuellement l'encodage du navigateur en GB2312. La page suivante s'affiche normalement.

La raison est que le serveur Apache définit l'encodage global par défaut du serveur et ajoute AddDefaultCharset dans httpd.conf UTF-8 . A ce moment, le serveur enverra d'abord l'en-tête HTTP au navigateur, et sa priorité est supérieure à l'encodage déclaré dans la page. Naturellement, le navigateur ne le reconnaîtra pas correctement.

Il existe 2 solutions. Il est demandé aux administrateurs de l'ajouter dans le fichier de configuration de leurs propres machines virtuelles. AddDefaultCharset GB2312 pour remplacer la configuration globale ou configurez-la en .htaccess dans votre propre répertoire.

Résumé :

En un mot, le moyen le meilleur et le plus rapide de résoudre le code tronqué chinois PHP est de rendre l'encodage de la déclaration de page cohérent avec l'encodage interne de la base de données. Si la page Le numéro de page demandé est incohérent avec le codage interne de la base de données. , définissez l'encodage de la connexion, mysql_query("SET NAMES XXX ");

1.
Code chinois tronqué sur la page php
Recommandations vidéo associées : 1.
Tutoriel vidéo Dugu Jiujian (4)_PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn