J'avais un problème dans des noms de fichiers qui s'affichaient dans Thunar avec des petits carrés à la place de la plupart des caractères accentués.
Les fichiers avaient été récupérés d'on ne sait où et impossible d'en connaître l'encodage d'origine vu qu'ils étaient déjà en UTF8.
Grâce au génie de Elzen, j'ai pu résoudre complètement le problème.
Il a fait un script qui corrige tous les caractères de façon récursive, nom de répertoire compris.
Je poste donc tout ça car j'ai beaucoup cherché avant et ce problème ne semble pas courant.
Il a fallu d'abord trouver le code que python3 trouvait pour chaque fichier qui posait problème.
Pour cela j'ai isolé chaque exemple de fichier dans un répertoire seul et passé la commande suivante qui affiche dans le retour le code en question à la place du caractère accenté :
os.listdir(".")[0].encode()
Ensuite, il faut enrichir le dictionnaire en début de script avec les bons codes et les bons caractères.
Il suffit enfin d'appeler le script avec la commande suivante :
python3 [nom du script] [chemin du repertoire racine à traiter]
Voici le script :
#! /usr/bin/python3
# coding: Utf-8
import os
import sys
import subprocess
converts = { b"\xc2\x82": "é",
b"\xc2\x87": "ç",
b"\xc2\x8a": "è",
b"\xc2\x85": "à",
b"\xc2\x83": "â" }
def rename(origin):
target = origin.encode()
for weird, valid in converts.items():
target = subprocess.run(("tr", weird, valid),
input=target, capture_output=True).stdout
if target != origin.encode():
subprocess.run(("mv", origin, target))
target = target.decode()
if os.path.isdir(target):
for file in os.listdir(target):
rename(os.path.join(target, file))
if __name__ == "__main__":
for arg in sys.argv[1:]:
rename(arg)
Le problème est donc résolu, en espérant qu'il pourra servir à quelqu'un d'autre.
Joyeux Noël à tous !