Php et l'arabe(urgent)

Signaler
Messages postés
17
Date d'inscription
samedi 13 mai 2006
Statut
Membre
Dernière intervention
19 juin 2007
-
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
-
salut,
je suis en train de concevoir une application en php/mysql en langue arabe. la table mysql utilise l'encodage utf8_unicode_ci et l'affichage dans phpmyadmin est correct mais si  j'étais d'afficher les  données de  la table avec un script j'obtiens مادية. j'ai essayé de modifier l'encodage  de la page en utf8 ou en windows-1256 mais ça ne marche toujours pas. <dfn title="Unicode (multilingue), insensible à la casse"></dfn>
A voir également:

9 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut,

As-tu vérifié que la connexion  MySQL utilise l'encodage UTF-8 ? Car sinon, tu perds l'encodage sur le trajet des données entre MySQL et PHP...

Pour le savoir :
$link    = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$charset = mysql_client_encoding($link);

echo "The current character set is: $charset\n";

Pour le faire :
mysql_query("SET CHARACTER SET 'utf8'", $link);


Note, avec mysqli :
$charset = $mysqli->character_set_name();

Et :
if (!$mysqli->set_charset("utf8")) {

    printf("Error loading character set utf8: %s\n", $mysqli->error);

} else {

    printf("Current character set: %s\n", $mysqli->character_set_name());

}

Si le pb n'est pas là... A+
A+
Messages postés
17
Date d'inscription
samedi 13 mai 2006
Statut
Membre
Dernière intervention
19 juin 2007

j'ai essayé avec la fonction que voous m'avez donné et le message est






The current character set is: latin1.ma base de donnée ainsi que les tables utilisent utf8_unicode_ci mais en vain. les pages qui se chargent d'afficher les résultats de mes requêtes  sont réglés sur utf8 aussi.
merci de votre aide<dfn></dfn><dfn title="Unicode (multilingue), insensible à la casse"></dfn>
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
L'erreur est donc (peut-être) ici : The current character set is: latin1

Il ne faut pas confondre stockage des données, traitement des données et affichage des données...

Vos données ont beau être stocké au format utf8, elles sont traitées comme du latin1... Il faut que la CONNEXION à la base de donées soit dans le bon jeu de caractères, c'est à dire utf8.

La commande SQL pour changer ça est :
mysql_query("SET CHARACTER SET 'utf8'", $link);

ou avec mysqli :
$mysqli->set_charset("utf8")


Bien sûr, il faut le faire AVANT de récupérer les données de la base (via un select).
Messages postés
17
Date d'inscription
samedi 13 mai 2006
Statut
Membre
Dernière intervention
19 juin 2007

bon, j'ai obtenu un sursis donc j'ai décidé de réecrire tout le code depuis le début, ce qu'il me faut savoir ce sont les paramètres d'encodage de la base de données et des pages du site. est ce que je dois créer une base de données dont l'encodage est utf8, les pages doivent-ils être en utf8? merci.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
Salut,

Réercrire tout le code !!! C'est peut-être excessif... Enfin bon, donc le meilleur conseil que je puisse te donner : TOUT EN UTF8 UNICODE

Surtout si tu utilises une langue dont l'alphabet n'est pas, mais pas du tout, latin... Come l'arabe.

utf-8 est un jeu de caractère qui essaye de rassembler tout les alphabets. C'est une normalisation... c'est international... Donc il faut l'utiliser. Tu pourrais même utiliser utf-16.

Bref, il te suffit de
<li>changer la déclaration du jeu de caractère par défaut de ta base de données</li><li>changer les jeu de caractère par défaut des tables</li><li>et surtout, changer les jeu de caractère des champs textes des tables.</li><li>Créer une petite class d'abstraction de la base de donnée... qque chose de très simple comme ça :</li>class db {

    private $link;

    function __construct() {

       $this->link = mysql_connect(...);

       mysql_select_db('dbname',$this->link);

       $this->query("set character set 'utf8'");

    }

    function query($sql) {

       return mysql_query($sql,$this->link);

    }

}

// Exemple d'utilisation :

$db = new db;

$mysql_res = $db->query("select champs from table where cond");

// et traitement de $mysql_res comme tu sais faire.

<li>Bien penser à spécifier le jeu de caractère des pages générée
</li><li>via les entête HTTP : header('Content-type: text/html; charset: utf-8');</li><li>ou un balise META dans la page : <meta http-equiv="Content-type" content="text/html; charset utf-8" /></li><li>Et en cas de problème : les fonction utf8_encode() / utf8_decode() devraient te sauver.</li>A+
Messages postés
17
Date d'inscription
samedi 13 mai 2006
Statut
Membre
Dernière intervention
19 juin 2007

j'apprécie vraiemnt votre aide. vraiment merci.
pour la création je dois donc déclarer mes tables avec l'option "DEFAULT CHARSET = utf8" et est ce que je peux utiliser les fonctions mysql_query() .... à la place des fonctions que vous avez cité car je n'ai pas une grande sur la poo en php.
bon pour réecrire tout le code, ce n'est pas tout à fait le mot.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
oui, aucun problème pour utiliser mysql_query...

Simplement il ne faut pas oublier de définir une connexion à la base de donner en utf-8. Ca peut-être configuré par défaut qque part dans le fichier de configuration de mysql (my.conf)... mais je doute que tu ai accès à ce fichier.

Donc, il faut bien faire la requête "set character set 'utf8'" après la connexion à la base.

OK ?
Messages postés
17
Date d'inscription
samedi 13 mai 2006
Statut
Membre
Dernière intervention
19 juin 2007

j'ai tout essayé mais je n'arrive pas à résoudre le problème. c'est toujours ce The current character set is: latin1. ce qui ne résout pas mon problème. si vous avez une autre idée n'hésitez pas à me la filer. merci.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
9
non, aucune idée de plus, désolé...