PHP / MySQL avec des problèmes d'encodage

J'ai des problèmes avec PHP en ce qui concerne l'encodage.

j'ai une page JavaScript/jQuery HTML5 qui interagit avec mon script PHP en utilisant $.post. Cependant, PHP est confronté à un problème étrange, probablement lié à l'encodage.

quand j'écris

htmlentities("í")

Je m'attends à ce que PHP affiche í . Toutefois, il produit plutôt í Au début, je pensais que je faisais une erreur avec les codages, cependant

htmlentities("í")=="í"?"Good":"Fail";

sort " Fail", où

htmlentities("í")=="í"?"Good":"Fail";

Mais htmlentities($search, null, "utf-8") fonctionne comme prévu.

je veux que PHP communique avec un serveur MySQL, mais il a aussi des problèmes d'encodage, même si j'utilise utf8_encode. Que dois-je faire?

EDIT: sur la commande SQL, writing

SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

où XXX ne contient pas de caractères, fonctionne comme prévu, mais pas s'il y a tout 'í' char.

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

non seulement échoue pour í chars, mais il échoue aussi pour les chaînes sans aucun caractère "spécial". Supprimer les ' caractères des noms de jeu et des jeux de caractères ne semble pas changer quoi que ce soit.

je me connecte à la base de données MySQL en utilisant PDO.

EDIT 2: j'utilise MySQL version 5.1.30 de XAMPP pour Linux.

EDIT 3: en cours d'Exécution SHOW VARIABLES LIKE '%character%' de PhpMyAdmin sorties

character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /opt/lampp/share/mysql/charsets/

lancer la même requête à partir de mon script PHP(avec print_r) sorties:

Array
(
    [0] => Array
        (
            [Variable_name] => character_set_client
            [0] => character_set_client
            [Value] => latin1
            [1] => latin1
        )

    [1] => Array
        (
            [Variable_name] => character_set_connection
            [0] => character_set_connection
            [Value] => latin1
            [1] => latin1
        )

    [2] => Array
        (
            [Variable_name] => character_set_database
            [0] => character_set_database
            [Value] => latin1
            [1] => latin1
        )

    [3] => Array
        (
            [Variable_name] => character_set_filesystem
            [0] => character_set_filesystem
            [Value] => binary
            [1] => binary
        )

    [4] => Array
        (
            [Variable_name] => character_set_results
            [0] => character_set_results
            [Value] => latin1
            [1] => latin1
        )

    [5] => Array
        (
            [Variable_name] => character_set_server
            [0] => character_set_server
            [Value] => latin1
            [1] => latin1
        )

    [6] => Array
        (
            [Variable_name] => character_set_system
            [0] => character_set_system
            [Value] => utf8
            [1] => utf8
        )

    [7] => Array
        (
            [Variable_name] => character_sets_dir
            [0] => character_sets_dir
            [Value] => /opt/lampp/share/mysql/charsets/
            [1] => /opt/lampp/share/mysql/charsets/
        )

)

Running

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SHOW VARIABLES LIKE '%character%'

affiche un tableau vide.

5
demandé sur luiscubal 2009-01-02 02:35:44

3 réponses

Il est très important de spécifier l'encodage de htmlentities pour correspondre à l'entrée, comme vous l'avez fait dans votre dernier exemple, mais omis dans les trois premiers.

htmlentities($text,ENT_COMPAT,'utf-8');

en ce qui concerne les communications avec MySQL, vous devez vous assurer que la compilation de la connexion et le jeu de caractères correspondent aux données que vous transmettez. Vous pouvez soit le définir dans le fichier de configuration, soit à l'exécution en utilisant les requêtes suivantes:

SET NAMES utf8;
SET CHARACTER SET utf8;

assurez-vous que les jeux de caractères de la table, de la base de données et du serveur correspondent aussi. Il y a un paramètre que vous ne pouvez pas changer à l'exécution, et c'est le jeu de caractères du serveur. Vous devez le modifier dans le fichier de configuration:

[mysqld]
character-set-server = utf8
default-character-set = utf8 
skip-character-set-client-handshake

plus d'informations sur les jeux de caractères et les collations dans MySQL dans le manuel .

17
répondu Eran Galperin 2009-01-02 16:54:42

la Fin de la renaissance. Mais pour plus de référence voici quelques conseils supplémentaires:

  1. Utiliser mysql_set_charset au lieu de SET xxx
  2. assurez-vous que vous sauvegardez le fichier avec l'encodage UTF-8 (ceci est souvent négligé)
  3. en-têtes de série:

    <?php header("Content-type: text/html; charset=utf-8"); ?>

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

  4. si votre serveur Apache la configuration contient une directive AddDefaultCharset avec un encodage différent.
7
répondu Anthony Accioly 2011-08-23 17:13:50

je viens de tomber sur ce numéro. J'ai tout le contenu d'un site Web en espagnol, avec tous les personnages spéciaux que vous pouvez attendre (áéíñ) et leurs majuscules versions.

dans mon cas, c'était une incohérence avec le charset/collation du serveur. Tout le reste était réglé sur utf8, sauf le charset du serveur, qui avait latin1. Cela a causé toutes les données utf8 entrées dans la base de données pour afficher dans sa forme brute encodée, comme í égale un A avec tilde ~ ...

j'utilise mysqli, et pour le corriger, j'ai fait usage de la méthode expliquée ci-dessus par Anthony Accioly (en utilisant mysql_set_charset). Cette méthode a une version mysqli et c'est ce que j'ai utilisé.

après ça, j'étais perplexe. J'ai encore eu un gâchis en regardant mon site web. Bien sûr, je ne savais pas qu'en changeant ce latin1 en utf8 Je gâcherais aussi l'encodage/décodage des caractères de l'ensemble. Donc j'ai utilisé l'aide d'une chaîne en ligne encoder / décoder pour corriger mes données de table.

j'ai fait diverses exportations de toutes mes données de contenu (Vous pouvez les configurer pour obtenir des requêtes de mise à jour et ce sera plus rapide pour votre processus de mise à jour) et j'ai lancé la sortie sql à travers l'encodeur/décodeur en ligne mentionné ci-dessus, puis copié collé les requêtes fixes sur le panneau sql phpmyadmin... corrigeant ainsi mes erreurs d'encodage. Tout est maintenant comme il devrait être, et je suis en mesure de traiter recherches À Perte à nouveau: Maria, maria, maría, mariá correspondent tous à maria, maria, Maria, etc. Tous les caractères aigus évaluent à leur caractère de voyelle de base. Epic Win.

1
répondu EffectiX 2012-12-13 20:25:00