IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

array_multisort et encodage du fichier


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut array_multisort et encodage du fichier
    Bonjour,

    Je fais des tests avec le même site sur différents serveurs et les résultats obtenus m'étonnent.

    Contexte : Dév PHP avec base de données MySQL (exemples : http://aleph2at.free.fr ou http://www.aleph2at.fr)

    Je fais des tests sur 3 serveurs :
    - free.fr
    Base de données MySQL et tables en UTF8 version 5.3.x de PHP
    - alwaysdata
    Base de données MySQL et tables en UTF8 version 7.2.x de PHP
    -localhost
    Base de données MySQL et tables en UTF8 version 7.2.x de PHP

    Tous les php des 3 serveurs sont issus d'une même source (mon workspace sous eclipse) en UTF8 sauf un fichier encodé en ANSI pour les serveurs Free.fr et localhost :
    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
    62
    63
    64
    65
    <?php
     
    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);
    }
     
    ?>
    donc si ce fichier PHP est en ANSI sur free.fr et localhost, le tri se fait correctement et si ce fichier PHP est en UTF8 sur alwaysdata, le tri se fait correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        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 sur le tableau $El_Nom qui contient les noms avec accents
        array_multisort($El_Nom_sans_accent, SORT_ASC, SORT_STRING, $return2); // On fait le tri multiple en appliquant le tri d'El_Nom_sans_accent à $return2 qui contient la liste avec accent
    Si je passe le fichier de la fonction sans_accents en UTF8 sur localhost ou free.Fr, le tri est incorrect.
    Si je passe le fichier de la fonction sans_accents en ANSI sur alwaysdata, le tri est incorrect.

    Je pense que la solution est toute bête mais pour l'instant je ne la vois pas.

    Une idée ?

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Des exemples avant après ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par badaze Voir le message
    Des exemples avant après ?
    Voici plusieurs fichiers :
    - Liste_avec_accent_avant_tri.txt
    La liste de base commune avant tri
    - Cas ANSI :
    sur ce serveur (localhost) c'est OK quand le fichier est en ANSI
    + Liste_sans_accent_après_tri_ANSIOK.txt
    Liste triée sans accent
    + Liste_avec_accent_après_array_map_ANSI_OK.txt
    Liste triée avec accent après le array_map
    - Cas UTF8 :
    sur ce serveur c'est KO quand le fichier est en UTF8
    + Liste_sans_accent_après_tri_UTFK.txt
    Liste triée sans accent
    + Liste_avec_accent_après_array_map_UTF8_OK.txt
    Liste triée avec accent après le array_map

    Il semble que le traitement "sans_accent" fait sauter les caractères accentués dans le cas UTF8.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Peut-être qu'en passant par un tri insensible au type d'encodage cela fonctionnera dans tous les cas. Dans l'exemple qui suit je convertis les caractères en valeurs ASCII hexadécimale.
    Par contre je ne sais pas si la fonction ord fonctionne de la même manière en UTF-8 et en ANSI ?!?

    Code php : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php
    function sans_accents($string)
    // Retourne 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);
    }function toHEX($string)
    {
     $return = "";
     for ($i=0;$i<strlen($string);$i++)
     {
      $return = $return.dechex(ord(substr($string,$i,1)));
     }
     
     return $return;
    }
     
    $return2 = file('Liste_avec_accent_avant_tri.txt');
    foreach ($return2 as $key => $row) 
    {
        $El_Nom[$key] = toHEX(sans_accents(strtolower($row)));
    }
    array_multisort($El_Nom, SORT_ASC, SORT_STRING, $return2); 
     
    foreach($return2 as $value)
    {
     print "$value<br/>";
    }
    Fichiers attachés Fichiers attachés
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    les fonctions strtr() et strtolower() ne sont pas compatibles UTF-8, elles pètent les chaînes de caractères.
    Pour les fichiers encodés UTF-8, tu dois utiliser str_replace et mb_strtolower.
    D'ailleurs, tu ne dois plus t'embêter : tu encodes tout en UTF-8 sans BOM et utilises uniquement la bibliothèque unicode (fonctions mb_xxx, multibyte strings)

  6. #6
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Salut,

    les fonctions strtr() et strtolower() ne sont pas compatibles UTF-8, elles pètent les chaînes de caractères.
    Pour les fichiers encodés UTF-8, tu dois utiliser str_replace et mb_strtolower.
    D'ailleurs, tu ne dois plus t'embêter : tu encodes tout en UTF-8 sans BOM et utilises uniquement la bibliothèque unicode (fonctions mb_xxx, multibyte strings)
    Merci pour ta réponse, et je pense que le sujet est encore à creuser comme l'explique akniep at linklift dot net sur le lien http://php.net/manual/fr/function.mb-strtolower.php

    La fonction qui semble poser un problème (qui fait sauter des caractères) est array_map dans sa prise en charge d'un fichier UTF8 sans BOM sachant que sur un autre serveur (alwaysdata) cela fonctionne très bien....????

    J'ai dupliqué la base de données en localhost pour faire des tests d'encodage mais cela ne change rien.
    Le problème semble vraiment lié à la prise en charge de l'encodage du fichier :
    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);
    }
    par la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       $El_Nom_sans_accent = array_map('sans_accents', $El_Nom); // On enlève les accents
    cf post précédent pour les fichiers de log.

    J'ai besoin de faire des tris sur des caractères non latin voire exotiques (écritures du monde).
    Mes fichiers sont déjà en UTF8 sans BOM (par facilité).

    Si un spécialiste de l'encodage peut participer à la discussion j'en serais ravi.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ok essaie avec ceci :
    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
    function sans_accents($string)
    {
        $string = str_replace(array(
            'Á', 'Â', 'Ä', 'À', 'Ã', 'Å', 'Ç', 'É', 'È', 'Ê', 'Ë', 'Í', 'Ï', 
            'Î', 'Ì', 'Ñ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'Ú', 'Ù', 'Û', 'Ü', 'Ý', 
            'á', 'à', 'â', 'ä', 'ã', 'å', 'ç', 'é', 'è', 'ê', 'ë', 'í', 'ì', 
            'î', 'ï', 'ñ', 'ó', 'ò', 'ô', 'ö', 'õ', 'ú', 'ù', 'û', 'ü', 'ý', 'ÿ'
        ), 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);
     
        return preg_replace('#[^a-zA-Z0-9\-\._]#u', ' ', $string);
    }

  8. #8
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    @rawsrc

    Si je remplace mon code par celui-ci, je n'ai plus aucun tri et plein de caractères qui sautent. cf fichier liste_sans_accent_après_tri_rawsrc_KO.txt

    Mais je viens de m'apercevoir que même avec mon fichier en ANSI, le tri n'est pas parfait cf fichier liste_sans_accent_après_tri_sb_demiOK.txt
    Je continue à chercher le pourquoi du comment.array_map_20180920.zip

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    ben j'ai essayé de mon côté et je dois t'avouer que je récupère bien tout avec ce code :
    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
     
     
    $data = ["a-hmao", "aari", "aarai", "ara", "ari", "aro", "arra", "arri", "abaza", "abénaquis", "abkhaze", "sino-thaã¯", "achang", "acholi", "acoli", "akoli", "acooli", "atscholi", "shuli", "gang", "lwoo", "lwo", "adyghé", "afar", "afrihili", "afrikaans", "agnéen", "tokharien a", "agnier", "mohawk", "ahom", "aïnu", "aisor", "akan", "akkadien", "alabama", "albanais", "aléoute", "allemand", "alsacien", "altaï", "alyawarra", "américain", "amharique", "amo", "amorrite", "andoque", "andoque", "anglais", "anindilyakwa", "apache", "arabe", "araméen", "araméen samaritain", "arapaho", "arara", "arawak", "arcado-chypriote", "arménien", "aroumain", "valaque", "artchi", "archib", "archin", "archintsy", "archsel", "arshashdib", "arunta de l'ouest ", "assamais", "assyrien", "athapascan", "avar", "ma'arul mats", "avestique", "avesta", "awadhi", "awaswas", "coastanoan de santa cruz", "aymara", "ayoreo", "azéri", "azerbaïdjanais", "aztèque", "baasa", "bassa", "babylonien", "bachkir", "badaga", "bagheli", "bai", "balear", "balinais", "balkar", "baloutchi", "balti", "bambara", "bamanankan", "bamileke", "bamoum", "baoulé", "basque", "batak", "bateri", "bengali", "berbère", "bhili", "bhojpuri", "bhoutanais", "biélorusse", "bihari", "birman", "blackfoot", "bonan", "bororo", "bosniaque", "bouriate", "buryat", "bouthan", "brahui", "braj bhasha", "breton", "bugi", "buhid", "bulang", "bulgare", "burushaski", "buyi", "cajun", "cambodgien", "cananéen", "carélien", "caribe", "carien", "carthaginois", "catalan", "cebuano", "celte", "celtibère", "chakma", "cham", "champenois", "chaoui", "cherokee", "cheyenne", "chhattisgarhi", "chibcha", "chickasaw", "chinois", "chinook", "chipewyan", "choctaw", "chol", "chukchi", "cinghalais", "singhalais", "coeur d'alène", "snchitsu'umshtsn", "comanche", "comorien", "shikomori", "copte", "coréen", "cornique", "corse", "cree", "croate", "dai", "dairi batak", "dakelh", "carrier", "dakota", "dalmate", "illyro-roman", "danois", "daour", "dargwa", "dari", "de'ang", "delaware", "lenape", "démotique", "dioula", "divehi", "maldivien", "djuka", "dogon", "dogri", "dogra", "dong", "dongxiang", "dorien", "douala", "drung", "derung", "dungan", "dzongkha", "rdzong-kha", "eblaïte", "ecossais", "gaélique écossais", "edo", "egyptien", "elamite", "emérillon", "teko", "eolien", "eskaya", "espagnol", "castillan", "espéranto", "estonien", "etrusque", "ewe", "ewenki", "ewondo", "falisque", "fang", "fanti", "farsi", "féroïen", "fidjien", "finnois", "flamand", "français", "francique", "frioulan", "frison", "fulfulde", "gaélique", "gagauz", "galicien", "galla", "gallo", "gallois", "gandhari", "gaoshan", "garhwali", "garo", "garshuni", "gascon", "gaumais", "gelao", "géorgien", "gondi", "gothique", "grec", "dhimotiki", "grec démotique", "grec moderne", "guajiro", "guanche", "guarani", "guèze", "ge'ez", "gujarâtî", "goudjarâtî", "gwich'in", "hadhramautique", "haida", "hani", "hanuno'o", "haoussa", "hausa", "harauti", "hatti", "hawaïen", "hébreu", "hébreu samaritain", "himyaritique", "hindi", "hitchiti", "hittite", "nesili", "hmong", "ho", "hollandais", "néerlandais", "hongrois", "magyar", "hopi", "hotcâk", "hsihsia", "hurrite", "ibérique", "ibibio", "ido", "igbo", "illyrien", "ilocano", "indonésien", "ingouche", "inuktitut", "iñupiaq", "iñupiak", "ionien", "irlandais", "iroquois", "islandais", "italien", "jalaa", "japonais", "jarawa", "javanais", "jingpho", "jinuo", "judéo-espagnol", "djudezmo", "kabardien", "kabyle", "kachchi", "kachoube", "cachoube", "kala lagaw", "kalasha", "kalashamon", "kalmouk", "kalmyk-oirat", "kalumpang", "kanauji", "kankan", "kannada", "kannara", "kanouri", "karakalpak", "karatchaï", "austronã©sien", "karelian", "karo batak", "kashmiri", "katharevousa", "kawi", "kazakh", "keresan", "khakass", "indien", "khamti", "khanty", "ostiak", "khasi", "khmer", "khotanais", "kinyamwesi", "kirghize", "kiribati", "kirundi", "rundi", "kituba", "kiyeke", "kogui", "koinè", "komi", "egyptien", "konkan", "konkani", "koryak", "koutchéen", "tokharien b", "kpellé", "krou", "kucheo", "kuci", "kurde", "kurmanji", "kurukh", "kwakwala", "ladin", "ladino", "lahu", "lak", "lakota", "lambadi", "landa", "lao", "laotien", "lapon", "samé", "lapp", "latin", "laz", "lepcha", "lépontique", "letton", "lezghien", "li", "libyque", "ligure", "génois", "limbu", "lingala", "lisu", "lithuanien", "live", "loma", "lombard", "lorrain", "louvite", "luwien", "lucanien", "lue", "luri", "lushootseed", "luxembourgeois", "lycien", "lydien", "maa", "macédonien", "mâgadhî", "maithili", "makasar", "malais", "malayalam", "malayî", "malgache", "malinke", "maltais", "malto", "mamasa", "mandailing batak", "mandar", "mandchou", "mandéen", "mannois", "mansi", "vogoul", "maonan", "maori", "mapudungun", "araucan", "marathi", "mari", "tchérémisse", "marwari", "matsés", "maya", "yucatec", "meitei", "manipouri", "mende", "méroïtique", "messapien", "miao", "micmac", "minangkabau", "mindoro", "mingrelian", "mithila", "moghol", "moinba", "monpa", "menba", "monba", "menpa", "mongba", "môn", "mongol", "moore", "moré", "mordve", "mulao", "multani", "mundari", "murrinbata", "muskogee", "naga", "nahuatl", "nanai", "navajo", "naxi", "ndebele", "nenets", "népalais", "népali", "netets", "newari", "néware", "nogai", "norrois", "norvégien", "nu", "nubien", "nuer-dinka", "nukak", "nushu", "nuudzahui", "ojibwe", "ombrien", "ongota", "birale", "onondaga", "onontagué", "oriya", "orominga", "oromo", "oroqen", "osque", "ossète", "oubykh", "oudmourte", "ougaritique", "ouïgour", "ourdou", "ouzbek", "pacahuara", "pacaguara", "pahlavi", "palaïte", "pâli", "pamphylien", "papiamento", "papiamentu", "parsi-dari", "parthe", "pashto", "pendjabi", "punjabi", "perse", "peul", "phénicien", "phrygien", "picard", "pirahã", "pitjantjara", "polonais", "portugais", "pre-proto-zoquean", "proto-euphratéen", "provençal", "prussien", "pumi", "pyu", "q'eqchi'", "kekchi", "qatabanique", "qiang", "quechua", "runa simi", "quiché", "raetique", "rhaetique", "rhaetien", "riang", "rohingya", "roman", "romanche", "róng", "roumain", "rromani", "russe", "sa'dan-toraja", "sabaique", "sabéen", "sahaptan", "salar", "samaritain", "samoyède", "sanskrit", "santâlî", "sarde", "scots", "selkoupe", "serbe", "serbo-croate", "shan", "tai-yai", "tai-long", "she", "sheba", "sherpa", "shona", "shor", "shui", "sibo", "sicule", "sidétique", "sil'oti", "simalungun", "sindhi", "singhalais", "sinhala", "slavon", "slovaque", "slovène", "sogdien", "somali", "songhaï", "sonrhaï", "soninke", "sarakholé", "sora", "sorabe", "sosso", "soussou", "souletin", "sourashtra", "sud-picène", "picène du sud", "sudovien", "yotvingien", "suédois", "sumérien", "swadaya", "swahili", "kiswahili", "sylhet", "syriaque", "ta'e", "tabasarin", "tachawit", "tachelhit", "tadjik", "tagalog", "tagbanwa", "tahitien", "tai dam", "talondo'", "tamasheq", "tamazight", "tamoul", "tangoute", "xixia", "tano", "tat", "tatar", "tchèque", "tchétchène", "tchouvache", "télougou", "telugu", "temü-tan", "thaï", "thamudique", "thrace", "thuringien", "tibétain", "tigré", "tigrigna", "timur", "tirhut", "tlingit", "lingít", "toala'", "toba batak", "tongan", "faka-tonga", "touareg", "tsakonien", "tsakon", "tsalagi", "tu", "tudesque", "tujia", "tulu", "tumbuka", "toumbouka", "turc", "turkmène", "inuit", "turoyo", "tuva", "tzeltal", "tzotzil", "udekhe", "ukrainien", "umbundu", "vaï", "valencien", "venda", "tshivenda", "luvenda", "vénète", "vénitien", "vepse", "vietnamien", "volapük", "vote", "wallon", "warlpiri", "wik-mungkan", "woleai", "wolof", "ouolof", "xhosa", "xibo", "xiongnu", "yakut", "sakha", "yao", "yi", "lolo", "yiddish", "yora", "nahua", "parquenahua", "yoruba", "yugur", "zapotèque", "zarma", "zénète", "zhuang", "zoulou", "isizulu", "zuñi"];
     
    function sans_accents($string)
    {
        $string = str_replace(array(
            'Á', 'Â', 'Ä', 'À', 'Ã', 'Å', 'Ç', 'É', 'È', 'Ê', 'Ë', 'Í', 'Ï',
            'Î', 'Ì', 'Ñ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'Ú', 'Ù', 'Û', 'Ü', 'Ý',
            'á', 'à', 'â', 'ä', 'ã', 'å', 'ç', 'é', 'è', 'ê', 'ë', 'í', 'ì',
            'î', 'ï', 'ñ', 'ó', 'ò', 'ô', 'ö', 'õ', 'ú', 'ù', 'û', 'ü', 'ý', 'ÿ'
        ), 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);
     
        return preg_replace('#[^a-zA-Z0-9\-\._]#u', ' ', $string);
    }
     
    $clean = array_map('sans_accents', $data);
    array_multisort($clean, SORT_ASC, SORT_STRING, $data);

  10. #10
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Salut,

    ben j'ai essayé de mon côté et je dois t'avouer que je récupère bien tout avec ce code :
    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
     
     
    $data = ["a-hmao", "aari", "aarai", "ara", "ari", "aro", "arra", "arri", "abaza", "abénaquis", "abkhaze", "sino-thaã¯", "achang", "acholi", "acoli", "akoli", "acooli", "atscholi", "shuli", "gang", "lwoo", "lwo", "adyghé", "afar", "afrihili", "afrikaans", "agnéen", "tokharien a", "agnier", "mohawk", "ahom", "aïnu", "aisor", "akan", "akkadien", "alabama", "albanais", "aléoute", "allemand", "alsacien", "altaï", "alyawarra", "américain", "amharique", "amo", "amorrite", "andoque", "andoque", "anglais", "anindilyakwa", "apache", "arabe", "araméen", "araméen samaritain", "arapaho", "arara", "arawak", "arcado-chypriote", "arménien", "aroumain", "valaque", "artchi", "archib", "archin", "archintsy", "archsel", "arshashdib", "arunta de l'ouest ", "assamais", "assyrien", "athapascan", "avar", "ma'arul mats", "avestique", "avesta", "awadhi", "awaswas", "coastanoan de santa cruz", "aymara", "ayoreo", "azéri", "azerbaïdjanais", "aztèque", "baasa", "bassa", "babylonien", "bachkir", "badaga", "bagheli", "bai", "balear", "balinais", "balkar", "baloutchi", "balti", "bambara", "bamanankan", "bamileke", "bamoum", "baoulé", "basque", "batak", "bateri", "bengali", "berbère", "bhili", "bhojpuri", "bhoutanais", "biélorusse", "bihari", "birman", "blackfoot", "bonan", "bororo", "bosniaque", "bouriate", "buryat", "bouthan", "brahui", "braj bhasha", "breton", "bugi", "buhid", "bulang", "bulgare", "burushaski", "buyi", "cajun", "cambodgien", "cananéen", "carélien", "caribe", "carien", "carthaginois", "catalan", "cebuano", "celte", "celtibère", "chakma", "cham", "champenois", "chaoui", "cherokee", "cheyenne", "chhattisgarhi", "chibcha", "chickasaw", "chinois", "chinook", "chipewyan", "choctaw", "chol", "chukchi", "cinghalais", "singhalais", "coeur d'alène", "snchitsu'umshtsn", "comanche", "comorien", "shikomori", "copte", "coréen", "cornique", "corse", "cree", "croate", "dai", "dairi batak", "dakelh", "carrier", "dakota", "dalmate", "illyro-roman", "danois", "daour", "dargwa", "dari", "de'ang", "delaware", "lenape", "démotique", "dioula", "divehi", "maldivien", "djuka", "dogon", "dogri", "dogra", "dong", "dongxiang", "dorien", "douala", "drung", "derung", "dungan", "dzongkha", "rdzong-kha", "eblaïte", "ecossais", "gaélique écossais", "edo", "egyptien", "elamite", "emérillon", "teko", "eolien", "eskaya", "espagnol", "castillan", "espéranto", "estonien", "etrusque", "ewe", "ewenki", "ewondo", "falisque", "fang", "fanti", "farsi", "féroïen", "fidjien", "finnois", "flamand", "français", "francique", "frioulan", "frison", "fulfulde", "gaélique", "gagauz", "galicien", "galla", "gallo", "gallois", "gandhari", "gaoshan", "garhwali", "garo", "garshuni", "gascon", "gaumais", "gelao", "géorgien", "gondi", "gothique", "grec", "dhimotiki", "grec démotique", "grec moderne", "guajiro", "guanche", "guarani", "guèze", "ge'ez", "gujarâtî", "goudjarâtî", "gwich'in", "hadhramautique", "haida", "hani", "hanuno'o", "haoussa", "hausa", "harauti", "hatti", "hawaïen", "hébreu", "hébreu samaritain", "himyaritique", "hindi", "hitchiti", "hittite", "nesili", "hmong", "ho", "hollandais", "néerlandais", "hongrois", "magyar", "hopi", "hotcâk", "hsihsia", "hurrite", "ibérique", "ibibio", "ido", "igbo", "illyrien", "ilocano", "indonésien", "ingouche", "inuktitut", "iñupiaq", "iñupiak", "ionien", "irlandais", "iroquois", "islandais", "italien", "jalaa", "japonais", "jarawa", "javanais", "jingpho", "jinuo", "judéo-espagnol", "djudezmo", "kabardien", "kabyle", "kachchi", "kachoube", "cachoube", "kala lagaw", "kalasha", "kalashamon", "kalmouk", "kalmyk-oirat", "kalumpang", "kanauji", "kankan", "kannada", "kannara", "kanouri", "karakalpak", "karatchaï", "austronã©sien", "karelian", "karo batak", "kashmiri", "katharevousa", "kawi", "kazakh", "keresan", "khakass", "indien", "khamti", "khanty", "ostiak", "khasi", "khmer", "khotanais", "kinyamwesi", "kirghize", "kiribati", "kirundi", "rundi", "kituba", "kiyeke", "kogui", "koinè", "komi", "egyptien", "konkan", "konkani", "koryak", "koutchéen", "tokharien b", "kpellé", "krou", "kucheo", "kuci", "kurde", "kurmanji", "kurukh", "kwakwala", "ladin", "ladino", "lahu", "lak", "lakota", "lambadi", "landa", "lao", "laotien", "lapon", "samé", "lapp", "latin", "laz", "lepcha", "lépontique", "letton", "lezghien", "li", "libyque", "ligure", "génois", "limbu", "lingala", "lisu", "lithuanien", "live", "loma", "lombard", "lorrain", "louvite", "luwien", "lucanien", "lue", "luri", "lushootseed", "luxembourgeois", "lycien", "lydien", "maa", "macédonien", "mâgadhî", "maithili", "makasar", "malais", "malayalam", "malayî", "malgache", "malinke", "maltais", "malto", "mamasa", "mandailing batak", "mandar", "mandchou", "mandéen", "mannois", "mansi", "vogoul", "maonan", "maori", "mapudungun", "araucan", "marathi", "mari", "tchérémisse", "marwari", "matsés", "maya", "yucatec", "meitei", "manipouri", "mende", "méroïtique", "messapien", "miao", "micmac", "minangkabau", "mindoro", "mingrelian", "mithila", "moghol", "moinba", "monpa", "menba", "monba", "menpa", "mongba", "môn", "mongol", "moore", "moré", "mordve", "mulao", "multani", "mundari", "murrinbata", "muskogee", "naga", "nahuatl", "nanai", "navajo", "naxi", "ndebele", "nenets", "népalais", "népali", "netets", "newari", "néware", "nogai", "norrois", "norvégien", "nu", "nubien", "nuer-dinka", "nukak", "nushu", "nuudzahui", "ojibwe", "ombrien", "ongota", "birale", "onondaga", "onontagué", "oriya", "orominga", "oromo", "oroqen", "osque", "ossète", "oubykh", "oudmourte", "ougaritique", "ouïgour", "ourdou", "ouzbek", "pacahuara", "pacaguara", "pahlavi", "palaïte", "pâli", "pamphylien", "papiamento", "papiamentu", "parsi-dari", "parthe", "pashto", "pendjabi", "punjabi", "perse", "peul", "phénicien", "phrygien", "picard", "pirahã", "pitjantjara", "polonais", "portugais", "pre-proto-zoquean", "proto-euphratéen", "provençal", "prussien", "pumi", "pyu", "q'eqchi'", "kekchi", "qatabanique", "qiang", "quechua", "runa simi", "quiché", "raetique", "rhaetique", "rhaetien", "riang", "rohingya", "roman", "romanche", "róng", "roumain", "rromani", "russe", "sa'dan-toraja", "sabaique", "sabéen", "sahaptan", "salar", "samaritain", "samoyède", "sanskrit", "santâlî", "sarde", "scots", "selkoupe", "serbe", "serbo-croate", "shan", "tai-yai", "tai-long", "she", "sheba", "sherpa", "shona", "shor", "shui", "sibo", "sicule", "sidétique", "sil'oti", "simalungun", "sindhi", "singhalais", "sinhala", "slavon", "slovaque", "slovène", "sogdien", "somali", "songhaï", "sonrhaï", "soninke", "sarakholé", "sora", "sorabe", "sosso", "soussou", "souletin", "sourashtra", "sud-picène", "picène du sud", "sudovien", "yotvingien", "suédois", "sumérien", "swadaya", "swahili", "kiswahili", "sylhet", "syriaque", "ta'e", "tabasarin", "tachawit", "tachelhit", "tadjik", "tagalog", "tagbanwa", "tahitien", "tai dam", "talondo'", "tamasheq", "tamazight", "tamoul", "tangoute", "xixia", "tano", "tat", "tatar", "tchèque", "tchétchène", "tchouvache", "télougou", "telugu", "temü-tan", "thaï", "thamudique", "thrace", "thuringien", "tibétain", "tigré", "tigrigna", "timur", "tirhut", "tlingit", "lingít", "toala'", "toba batak", "tongan", "faka-tonga", "touareg", "tsakonien", "tsakon", "tsalagi", "tu", "tudesque", "tujia", "tulu", "tumbuka", "toumbouka", "turc", "turkmène", "inuit", "turoyo", "tuva", "tzeltal", "tzotzil", "udekhe", "ukrainien", "umbundu", "vaï", "valencien", "venda", "tshivenda", "luvenda", "vénète", "vénitien", "vepse", "vietnamien", "volapük", "vote", "wallon", "warlpiri", "wik-mungkan", "woleai", "wolof", "ouolof", "xhosa", "xibo", "xiongnu", "yakut", "sakha", "yao", "yi", "lolo", "yiddish", "yora", "nahua", "parquenahua", "yoruba", "yugur", "zapotèque", "zarma", "zénète", "zhuang", "zoulou", "isizulu", "zuñi"];
     
    function sans_accents($string)
    {
        $string = str_replace(array(
            'Á', 'Â', 'Ä', 'À', 'Ã', 'Å', 'Ç', 'É', 'È', 'Ê', 'Ë', 'Í', 'Ï',
            'Î', 'Ì', 'Ñ', 'Ó', 'Ò', 'Ô', 'Ö', 'Õ', 'Ú', 'Ù', 'Û', 'Ü', 'Ý',
            'á', 'à', 'â', 'ä', 'ã', 'å', 'ç', 'é', 'è', 'ê', 'ë', 'í', 'ì',
            'î', 'ï', 'ñ', 'ó', 'ò', 'ô', 'ö', 'õ', 'ú', 'ù', 'û', 'ü', 'ý', 'ÿ'
        ), 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);
     
        return preg_replace('#[^a-zA-Z0-9\-\._]#u', ' ', $string);
    }
     
    $clean = array_map('sans_accents', $data);
    array_multisort($clean, SORT_ASC, SORT_STRING, $data);
    Oui je suis d'accord avec toi tant que le code est encodé en ANSI mais dès que je l'encode en UTF8 cela met le bazar.
    Je vais essayer de supprimer complètement ce fichier et de repartir sur un fichier neuf en UTF8.

  11. #11
    Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2016
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Même en repartant d'un fichier vierge en UTF8, le tri ne se fait pas correctement. Et dès que je l'encode en ANSI, ça fonctionne.
    C'est sûrement un petit truc de rien du tout, il faut que je le trouve.


    J'ai testé aussi le rapatriement du sans_accent dans le fichier (en UTF8) où se passe l'array_multisort mais idem, si le fichier est en UTF8 c'est n'importe quoi, s'il est en ANSI c'est correct.

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Mes fichiers sont tous encodés en utf-8 sans Bom

Discussions similaires

  1. encoder des fichiers audio
    Par thugelife dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 16/07/2009, 20h54
  2. [BATCH]script pour encoder des fichiers dans une arborescence
    Par ashgan44 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 11/05/2009, 16h04
  3. Encoder un fichier en .avi
    Par miketidy dans le forum Vidéo
    Réponses: 4
    Dernier message: 17/09/2008, 14h44
  4. Encoder un fichier en base64
    Par drayogo dans le forum VBScript
    Réponses: 4
    Dernier message: 17/09/2008, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo