[RESOLU] PHP et la langue arabe

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 09:01

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: الْكِتَابُ

Eléphant du PHP | 169 Messages

26 août 2008, 09:11

Bonjour,


Tu utilises quel éditeur ? Quel charset ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

26 août 2008, 09:55

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.
Quand tout le reste a échoué, lisez le mode d'emploi...

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 10:37

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.

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 15:30

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

26 août 2008, 15:46

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'");
Quand tout le reste a échoué, lisez le mode d'emploi...

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 16:10

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&nbsp;'.$word.'<br/>';
echo 'make a new search';
}
else
{
while($row = mysql_fetch_array($results))
  {
  $nom = $row['nom'];
  $prenom = $row['prenom'];
echo 'le nom est:&nbsp' .$nom. '&nbsp;' .$prenom;
}
}
    ?>

ViPHP
AB
ViPHP | 5818 Messages

26 août 2008, 16:19

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.
Modifié en dernier par AB le 26 août 2008, 16:24, modifié 1 fois.

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 16:20

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";


Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 16:27

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";

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 août 2008, 16:29

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. |*()
Modifié en dernier par sadeq le 26 août 2008, 16:32, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
AB
ViPHP | 5818 Messages

26 août 2008, 16:30

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... :wink:

ViPHP
AB
ViPHP | 5818 Messages

26 août 2008, 16:41

@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...

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 17:59

@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

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2008, 18:05

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%'" ;
}