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

Langage PHP Discussion :

Script de conversion d'encodage


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Script de conversion d'encodage
    Bonjour,
    Quelqu'un de sympa m'avait fourni un script qui parcourait tous les fichiers d'un répertoire pour vérifier leur encodage et le convertir en utf-8. Malheureusement, suite à différentes mises à jour, j'ai perdu et le nom de la personne et le script.
    La solution de reprendre un à un tous les fichiers d'un ou plusieurs projet avec mon éditeur préféré (Notepad++) est assez fastidieux sans compter les risques d'erreurs en manipulations répétitives.
    Vous allez sûrement me dire que je pourrais le faire moi-même mais d'une part pourquoi refaire quelque chose qui existe et d'autre part, les problèmes d'encodage sont pleins d'écueils que j'aimerais éviter.
    Au cas, où je devrais tout me palucher, je me pose la question de savoir s'il suffit de lire le contenu, détecter son codage, le convertir et le réenregistrer ou s'il faut faire autre chose.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    On ne peut pas détecter un encodage: tout ce qu'on peut faire c'est procéder par élimination, et encore, il existe des encodages qui ne sont pas différentiables.

    Mais tu as de la chance dans ton malheur car l'un de tes encodages est l'utf-8 et comme l'utf-8 doit suivre certaines règles en ce qui concerne les octets utilisés et leur succession, il est facile de savoir qu'une chaîne ou un fichier n'est pas de l'utf-8. Il en va de même pour les encodages utf-16 et utf-32.

    Reste à savoir dans quel(s) encodage(s) sont les fichiers que tu cherches à convertir. À toi de le dire.

    Comptes-tu effectuer les conversions éventuelles en utilisant PHP? Disposes-tu d'une console linux?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    La plupart du temps, il s'agit d'ASCII à encoder en utf-8. Non je ne dispose pas de console LINUX. Je pense effectivement utiliser php. Si mon fichier est en ASCII (ANSI), je le convertis, sinon, je ne fais rien. Je ne sais d'ailleurs pas quelle différence il y a entre ANSI et ASCII. Les infos sur le sujet ne sont pas très claires. Si je comprends bien ANSI est un terme impropre qui désigne une organisation et non pas un codage.
    Est-ce que convertir un fichier c'est simplement convertir tout son contenu ou faut-il prendre d'autres choses en considération (FAT, BOM, etc.)?
    Est-ce que mb_internal_encoding et mb_convert_encoding suffisent?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par moimp Voir le message
    ...avec mon éditeur préféré (Notepad++)...
    ATTENTION à ne pas confondre :
    • Il ne s'agit pas d'"encoder en UTF-8", mais de "convertir en UTF-8" (sans BOM).

    Du moins, quand on utilise Notepad++ !

    @CosmoKnacki
    Ainsi, il n'est (à priori) pas nécessaire de "détecter l'encodage" initial du fichier.


    Par contre, je ne connais pas de script (PHP ou autre) qui fait ça automatiquement...


    Mais ça parle d'une chaine, pas d'un fichier complet.

    Il y a aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php header('Content-Type: text/html; charset=UTF-8');
    ... mais ça ne répond pas à la problématique.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    ATTENTION à ne pas confondre :
    • Il ne s'agit pas d'"encoder en UTF-8", mais de "convertir en UTF-8" (sans BOM).

    Du moins, quand on utilise Notepad++ !
    Exact

    Citation Envoyé par jreaux62 Voir le message

    Mais ça parle d'une chaîne, pas d'un fichier complet.
    Justement quelle est la différence? Si je lis la totalité du contenu avec file_get_contents, que je le convertis avec mb_convert_encoding et le réenregistre avec file_put_contents, ce n'est pas suffisant?

  6. #6
    Invité
    Invité(e)
    Par défaut
    1- As-tu testé ?

    N.B. Il y a aussi : mb_detect_encoding() ...
    Là aussi, c'est pour une chaine...


    2- J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($file, utf8_encode(file_get_contents($file)));
    Il semblerait que ça fonctionne (le fichier est bien en UTF-8)...
    ...Sauf que ça "encode", au lieu de "convertir" : les lettres accentués sont modifiées en d'autres caractères.
    • "à" -> "Ã*"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($file, mb_convert_encoding(file_get_contents($file), 'UTF-8'));
    Ici, les caractères accentués sont remplacés par des "?".
    • "à" -> "?"
    Dernière modification par Invité ; 05/08/2019 à 16h22.

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    En gros il faudrait faire ça:
    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
    $encoding_list = ['UTF-32LE', 'UTF-32BE', 'UTF-16LE', 'UTF-16BE', 'UTF-8', 'WINDOWS-1252'];
    $directory = 'path/to/your/files/';
    $extensions = ['txt', 'csv'];
    $backup_dir = 'path/to/your/files/backup/';
    $backup_ext = 'bak';
     
    $file_list = glob($directory . '*.{' . implode(',', $extensions) . '}', GLOB_BRACE);
     
    foreach($file_list as $file) {
        $content = file_get_contents($file);
        $encoding = mb_detect_encoding($content, $encoding_list, true);
     
        if ( $encoding === 'UTF-8' )
            continue;
     
        $filename = substr(strrchr("/$file", '/'), 1);
     
        if ( copy($file, $backup_dir . $filename . '.' . $backup_ext) === false ) {
            echo 'impossible de copier ', $file, PHP_EOL;
            continue;
        }
     
        file_put_contents($file, mb_convert_encoding($content, 'UTF-8', $encoding) );
     
    }
    Garde à l'esprit que mb_detect_encoding est incapable de faire la différence entre deux encodages du type 1 byte = 1 caractère (pour la bonne raison que c'est impossible), donc je n'ai mis qu'un encodage de ce type dans la liste de détection: WINDOWS-1252, donc si tu vois que certains caractères, comme le e dans l'o et le symbole euro, ne sont pas correctement restitués, tente le coup avec ISO-8859-15 à la place (il faut remplacer, pas ajouter).

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    J'ai testé avec le script suivant. Effectivement, ça ne fonctionne pas (les fichiers ne sont pas convertis). Ce qui peut vouloir dire trois choses:
    • J'ai une erreur dans mon code,
    • Il ne suffit pas de convertir le contenu,
    • Le dispositif d'encodage de Notepad++ ne vérifie pas l'encodage à chaque ouverture.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moimp Voir le message
    J'ai testé avec le script suivant...
    • Quel script ?
    • Quel(s) test(s) ?


    A priori, le code de CosmoKnacki fonctionne, avec 'ISO-8859-15'.

    J'ai testé sur un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $encoding_list = ['UTF-32LE', 'UTF-32BE', 'UTF-16LE', 'UTF-16BE', 'UTF-8', 'ISO-8859-15'];
     
    $file = 'test-encode.php';
    $content = file_get_contents($file);
    $encoding = mb_detect_encoding($content, $encoding_list, true);
    echo '$encoding : '.$encoding.'<br />';
    if( $encoding != 'UTF-8' )
    {
        file_put_contents( $file, mb_convert_encoding($content, 'UTF-8', $encoding) );
    }
    ?>
    Avec un fichier encodé en "ANSI" (avec Notepad++) :
    • Le fichier est bien converti en UTF-8
    • les caractères spéciaux (accentués,...) sont correctement restitués
    Dernière modification par Invité ; 07/08/2019 à 11h31.

Discussions similaires

  1. [XSLT] Conversion d'encodage
    Par FlyByck dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/02/2009, 23h01
  2. Faisabilité script Batch - conversion Excel en Csv
    Par ash_rmy dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/02/2009, 19h13
  3. Script de conversion de table Oracle vers SQL
    Par undercrash dans le forum Outils
    Réponses: 0
    Dernier message: 07/04/2008, 09h42
  4. Script PHP conversion AVI to FLV (Flash video)
    Par Kijer dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 10/02/2007, 09h56
  5. [WD10] comment faire un script de conversion?
    Par nath-0-0 dans le forum WinDev
    Réponses: 3
    Dernier message: 18/01/2007, 16h13

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