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 :
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;
}
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
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);
}
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

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