Bonjour
Dans le cadre de mon site perso De l'Aleph à l'@ http://aleph2at.free.fr j'ai un souci d'encodage de caractères.
Je vous donne le contexte :
Le site -> Une liste d'éléments (exemple La liste des écritures : http://aleph2at.free.fr/index.php?art=3185)
Cette liste se base sur une fonction :
La fonction sans_accents est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 function Elements_TousNoms_Liste($Table_Nom, $Table_Id = 0) { //Pourquoi ajouter l'argument $Table_Id alors qu'on peut l'avoir le $Table_Nom->Id ? global $Site; $Phrase_SQL = " SELECT " . $Table_Nom . ".*, CONCAT('index.php?art=',articles_elements_view.Article_Id) as URL, element_nom2.Nom2 AS Nom2 FROM " . $Table_Nom . " LEFT JOIN articles_elements_view ON ( articles_elements_view.Element_Id = " . $Table_Nom . ".Id AND articles_elements_view.Table_Id = " . $Table_Id . " AND articles_elements_view.Sens='ArtDsEl' AND articles_elements_view.Article_TypeId=2 ) LEFT JOIN element_nom2 ON ( element_nom2.Element_Table_Id = " . $Table_Id . " AND element_nom2.Element_Id = " . $Table_Nom . ".Id ) GROUP BY " . $Table_Nom . ".Nom ORDER BY " . $Table_Nom . ".Nom"; $result = mysql_query($Phrase_SQL) or die(mysql_error()); while ($row = mysql_fetch_array($result)) { $return[] = $row; } $i = 0; foreach ($return as $enreg) { $return2[$i] = $enreg; $return2[$i]['Nom2'] = $enreg['Nom']; // On utilise le champ Nom2 pour le futur tri sans accent et sans casse $i ++; if (($enreg['Nom2'] != '') || ($enreg['Nom2'] != NULL)) // On va ajouter les Nom2 dans la liste des Nom { $Nom2 = explode(";", $enreg['Nom2']); foreach ($Nom2 as $Nom) { $return2[$i] = $enreg; $return2[$i]['Nom'] = $Nom; $return2[$i]['Nom2'] = $return2[$i]['Nom']; // On utilise le champ Nom2 pour le futur tri sans accent et sans casse $i ++; } } } foreach ($return2 as $key => $row) // On mappe la clé Nom2 pour le tri multiple { $El_Nom[$key] = strtolower($row['Nom2']); } $El_Nom_sans_accent = array_map('sans_accents', $El_Nom); // On enlève les accents array_multisort($El_Nom_sans_accent, SORT_ASC, SORT_STRING, $return2); // On fait le tri multiple return $return2; }
Cette fonction est dans un fichier en encodage ANSI (je travaille sur notepad++) et cela fonctionne très très bien. Comme vous pouvez le voir sur la page http://aleph2at.free.fr/index.php?art=3185
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 function sans_accents($string) // Retoune une chaine de caractère sans les accents { $translit = array( 'Á' => 'A', 'À' => 'A', 'Â' => 'A', 'Ä' => 'A', 'Ã' => 'A', 'Å' => 'A', 'Ç' => 'C', 'É' => 'E', 'È' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Í' => 'I', 'Ï' => 'I', 'Î' => 'I', 'Ì' => 'I', 'Ñ' => 'N', 'Ó' => 'O', 'Ò' => 'O', 'Ô' => 'O', 'Ö' => 'O', 'Õ' => 'O', 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'á' => 'a', 'à' => 'a', 'â' => 'a', 'ä' => 'a', 'ã' => 'a', 'å' => 'a', 'ç' => 'c', 'é' => 'e', 'è' => 'e', 'ê' => 'e', 'ë' => 'e', 'í' => 'i', 'ì' => 'i', 'î' => 'i', 'ï' => 'i', 'ñ' => 'n', 'ó' => 'o', 'ò' => 'o', 'ô' => 'o', 'ö' => 'o', 'õ' => 'o', 'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'ÿ' => 'y' ); $string = strtr($string, $translit); return preg_replace('#[^a-zA-Z0-9\-\._]#', ' ', $string); }
Mais je souhaitais passer cette fonction dans une class (Site_class) et du coup l'intégrer dans eclipse en UTF8. Donc un convert2UTF8 dans notepad++
Et le résultat est un tri incohérent. C'est à dire que la gestion du tri sans accent n'est pas prise en compte.
Juste pour redonner une vue d'ensemble du problème :
Tout se passe bien sauf si la fonction sans_accents n'est pas en encodage ANSI
Partager