Page 1 sur 2
PHP et la langue arabe
Posté : 26 août 2008, 09:01
par Invité
bonjour,
J'ai mis en place un petit moteur de recherche en php, je peux recuperer les informations en francais et arabe, mais si l'utilisateur veut faire une recherche, il peut pas trouver les mots recherches en arabe, seulement en francais, j'ai pu connaitre le probleme, c'est que l'arabe a des lettres avec des caracteres speciaux.
Ma question est comment faire pour que l'utilisateur saisi un mot sans caracteres speciaux et peut trouver le resultat dans la base de donnee ou les mots sont insrer avec ces caracteres.
Note: Sans ces caracteres speciaux, il difficil de lire l'arabe, ainsi que ce texte doit fortement etre avec ces caracteres.
par exemple:
texte sans caracteres speciaux: الكتاب
le meme texte avec des caracteres speciaux: الْكِتَابُ
Posté : 26 août 2008, 09:11
par _activmik
Bonjour,
Tu utilises quel éditeur ? Quel charset ?
Posté : 26 août 2008, 09:55
par @rthur
Bonjour,
Le problème provient probablement de MySQL, vu que c'est ta requête SQL qui doit te renvoyer les bons résultats... (j'imagine un peu de la même manière qu'en français on peut faire une recherche indifférement avec ou sans caractère accentué)
Dans un premier temps, vérifie que le charset de ta table MySQL est correct (cp1256 si j'en crois la doc)
http://dev.mysql.com/doc/refman/5.0/en/ ... -sets.html
Une petite recherche sur Google m'a également permis de trouver cela:
http://dev.mysql.com/doc/refman/5.0/en/ ... ction.html
Qui conseille en fait d'effectuer la requête:
mysql_query("SET NAMES 'cp1256'");
juste après ton mysql_connect(...)
N'ayant aucune connaissance en langue arabe, je ne peux pas t'aider davantage... si le problème ne peut pas être résolu ici, essaye les forums spécialisés sur MySQL car c'est je pense plutôt un problème de base de données plutôt que de PHP.
Posté : 26 août 2008, 10:37
par Invité
Le bon encodage des charset est BINARY, sans ca, on peut pas en avoir des resultats, je vous donne un petit exemple:
insert into table ... (... 'PHP débutant' ....);
alors comme vous voyez le mot "débutant" a un accent, alors si l'utilisateur effectue une recherche, il doit forcement ecrire "débutant" mais s'il ecrit "debutant" il n aura aucun resultat, parce que le mot "débutant" est diffetent de "debutant".
ca juste un exemple, en bref la requete sql fait une difference entre "é" et "e" et les considere 2 lettres differentes.
Posté : 26 août 2008, 15:30
par Invité
ou est ce que je peux mettre ce code la:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
pour changer mon encodage
Posté : 26 août 2008, 15:46
par @rthur
ou est ce que je peux mettre ce code la:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
pour changer mon encodage
ça se résume en une seule commande:
mysql_query("SET NAMES 'x'");
Posté : 26 août 2008, 16:10
par Invité
je l ai teste avec utf8 et cp-1256 mais ca ne donne aucun resultat:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
</head>
<?php
// information pour la connection a la DB
$host = 'localhost';
$user = 'root';
$pass = '*******';
$db = 'test';
if(isset($_POST['word'])) $word = $_POST['word'];
else $word = '';
if(isset($_POST['prenom'])) $prenom = $_POST['prenom'];
else $prenom = '';
if(isset($_POST['nom'])) $nom = $_POST['nom'];
else $nom = '';
// connection à la DB
$link = mysql_connect ($host,$user,$pass);
// insetion des caracteres utf pour la langue arabe
mysql_query("SET NAMES 'UTF8';", $link)or die('Erreur: '.mysql_error());
// selection de la DB
mysql_select_db($db) or die ('Erreur: '.mysql_error());
//connection
$connection = mysql_connect("$host", "$user", "$pass") or die('Erreur: '.mysql_error());;
$db = mysql_select_db($db, $connection) or die(mysql_error());
$select = "SELECT * from etudiant where nom like '%$word%' order by id ASC";
$results = mysql_query($select,$connection) or die('Erreur: '.mysql_error());
$total = mysql_num_rows($results);
if(!$total){
echo 'no result for the '.$word.'<br/>';
echo 'make a new search';
}
else
{
while($row = mysql_fetch_array($results))
{
$nom = $row['nom'];
$prenom = $row['prenom'];
echo 'le nom est: ' .$nom. ' ' .$prenom;
}
}
?>
Posté : 26 août 2008, 16:19
par AB
Peut-être apache qui par défaut envoie des entêtes au standard ISO-8859-1.
Essaie alors :
header('Content-type: text/html; charset=UTF-8');
...
//connexion
...
mysql_query("SET NAMES 'utf8'");
car l'entête apache priment sur la déclaration des balises meta html.
Posté : 26 août 2008, 16:20
par Invité
ces lignes a ignorer:
//connection
$connection = mysql_connect("$host", "$user", "$pass") or die('Erreur: '.mysql_error());;
$db = mysql_select_db($db, $connection) or die(mysql_error());
$select = "SELECT * from etudiant where nom like '%$word%' order by id ASC";
Posté : 26 août 2008, 16:27
par Invité
voila le code que j'ai mis:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
</head>
$Charset = 'utf8';
// connection à la DB
$link = mysql_connect ($host,$user,$pass);
// insetion des caracteres utf pour la langue arabe
mysql_query("SET NAMES $Charset", $link) or die('Erreur: '.mysql_error());
// selection de la DB
mysql_select_db($db) or die ('Erreur: '.mysql_error());
$select = "SELECT * from etudiant where nom like '%$word%' order by id ASC";
Posté : 26 août 2008, 16:29
par sadeq
Pour les recherches Mysql on peut s'appuyer aussi (mais pas trop) sur la sonorité en utilisant la fonction SOUNDEX.
Je ne sais pas si Mysql mesure bien la sonorité de deux mots arabes qui différent simplement par un manque d'accents (Achakl) il faut dire que même le français peut en souffrir puisque Mysql est anglais.
Mais ça pourrait être une piste à explorer pour comparer des mots sans oublier que la complexité pour l'arabe réside dans le fait que par exemple le mot الكتاب dont les accents sont absents et le mot الْكِتَابُ (AL Kitab) avec ses accents qui veut dire : Livre ne peuvent pas être considéré égaux puisqu'il existe un troisième mot (AL Kouttab) qui s'écrit exactement de la même façon sans accents (الكتاب) mais qui veut dire : L'école.

Posté : 26 août 2008, 16:30
par AB
ces lignes a ignorer:
//connection
$connection = mysql_connect("$host", "$user", "$pass") or die('Erreur: '.mysql_error());;
$db = mysql_select_db($db, $connection) or die(mysql_error());
$select = "SELECT * from etudiant where nom like '%$word%' order by id ASC";
Assurément les deux premières mais peut-être pas la dernière...

Posté : 26 août 2008, 16:41
par AB
@invité
J'avais pas vu ta réponse avant de poster.
La syntaxe que j'utilise est :
header('Content-type: text/html; charset=UTF-8');
...
mysql_connect("serveur","login","pass");
mysql_select_db("test");
mysql_query("SET NAMES 'utf8'");
$query =...
Inutile de te préciser qu'il faut également que ta table soit au format utf8...
Posté : 26 août 2008, 17:59
par Invité
@sadeq: la je ne cherche pas le sens du mot mais je cherche que l'utilisateur peut le trouver qu'il soit ecrit comme "الْكِتَابُ" ou encore "كتاب".
@AB: ma base de donnee ainsi que la table sont en utf8
Posté : 26 août 2008, 18:05
par Invité
j'ai fait une recherche et j'ai trouve ce code qui fait la recherche dans une base de donne qui contient des donnees en arabe:
$repstrng1 = "replace(nom,'ِ','')";
$repstrng2 = "replace(". $repstrng1 . ",'َ','')";
$repstrng4 = "replace(". $repstrng2 . ",'ً','')";
$repstrng5 = "replace(". $repstrng4 . ",'ُ','')";
$repstrng6 = "replace(". $repstrng5 . ",'ٌ','')";
$repstrng7 = "replace(". $repstrng6 . ",'ّ','')";
$repstrng8 = "replace(". $repstrng7 . ",'ٍ','')";
$repstrng9 = "replace(". $repstrng8 . ",'ْ','')";
if ($searchtype==1) {
$sql = "select * from table where " . $repstrng9 . " = '$searchterm'" ;
} else {
$sql = "select * from table where " . $repstrng9 . " like '%$searchterm%'" ;
}