PHP: Enlever les caractères insécables

Il y a quelques temps, j’écrivais un article expliquant et donnant une solution permettant de limiter les erreurs d’encodage. Dans cette même optique, je rédige ce post pour compléter ma première solution. Je rappelle ma problématique. Lors de traitement de donnée en masse depuis des fichiers qui peuvent être de plusieurs types (CSV, XLS, …), on rencontre régulièrement des problèmes d’encodages et des problèmes avec des caractères insécables.

Problème d’encodage

Pour résoudre nos problèmes d’encodage, j’avais initialement poster une solution qui consiste à ré-encoder nos chaines de caractères. Voici ma solution.

1
mb_convert_encoding($string, "UTF-8", mb_detect_encoding($string));

Supprimer les caractères insécables et invisibles

C’est la dernière erreur que j’ai fait : oublier de traiter tous les caractères et de faire du tri. Il existe des caractères dans la table ASCII qui ne sont plus vraiment utiles désormais. Le script que j’ai mis sous forme de Gists permet de traiter caractère par caractère et de supprimer les caractères qui ont un code inférieur à 32 et qui ne sont pas des caractères visibles et affichable.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
gc_disable();
$content = file_get_contents("db.csv");
if ($content === false) {
echo "ERROR: impossible to read the file.";
die();
}
for($i = 0; $i < strlen($content); $i++) {
$ascii = ord($content[$i]);
if (($ascii < 32 or $ascii > 126) and $ascii != 10) {
$content[$i] = "?";
}
}
if (file_put_contents("new.csv", $content) === false) {
echo "ERROR: impossible to write the new file.";
}

Avec des deux précautions, j’espère que vous pourrez comme moi limiter les erreurs de parsage de fichiers.