PHP Convertir l’encodage d’un fichier en UTF-8 (fopen)

PHP convertir l’encodage d’un fichier, comment on fait ? Passer de l’UTF-16 à l’UTF8 c’est facile ?

Dans la lignée de mon dernier article sur Créer et télécharger un fichier temporaire en PHP, je vais vous apprendre à convertir l’encodage d’un fichier en PHP

Mon fichier n’est pas en UTF-8 !

Récemment, j’ai eu à traiter de très gros fichiers CSV dont je ne connaissait pas la provenance. A l’ouverture dans Excell ou autre tableur, aucun soucis, mais en PHP, impossible de décoder le contenu correctement ! En fouillant un peu, je me suis rendu compte que le fichier était encodé en Unicode 1200 (UTF-16 Little endian)

Par défaut, PHP lit les fichiers en UTF-8, c’est pourquoi il était incapable d’interpréter correctement mon CSV. Il me fallait donc convertir mon fichier de UTF-16 en UTF-8.

Les filtres de conversion

Les fichiers à traiter étaient trop gros pour être lus en mémoire, j’ai donc du utiliser des flux (fonction fopen). Par chance, PHP permet d’ajouter un filtre de conversion sur un flux, ce qui permet de transformer son contenu à la volée !

Pour cela il faut s’assurer que l’extension PHP iconv est installée et activée.

Ensuite, il suffit d’appliquer le filtre de conversion sur le flux de votre fichier grâce à la fonction stream_filter_append:

// Ouvrir le flux en UTF-16 Little endian (ou tout autre encodage exotique)
$fp = fopen('chemin/du/fichier.csv', 'r');

// Application du filtre de conversion
stream_filter_append($fp, 'convert.iconv.utf-16le.utf-8');

// Traiter le contenu du fichier en UTF-8

// Fermer le flux
fclose($fp);

Évidemment, dans le paramètre du filtre convert.iconv.utf-16le.utf-8 vous pouvez remplacer l’encodage de la source et de la destination par ce que vous voulez !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *