2009-02-26 8 views
2

J'ai un tas de fichiers avec un mélange de codages principalement ISO-8859-1 et UTF-8.Recherche de fichiers codés ISO-8859-1?

Je voudrais faire tous les fichiers UTF-8, mais en essayant de coder par lots ces fichiers en utilisant iconv certains problèmes se posent. (coupes Fichiers de moitié, etc.)

Je supposse la raison est que iconv exige de connaître le « de » encoding, donc si la commande ressemble à ceci

iconv -f ISO-8859-1 -t UTF-8 in.php -o out.php 

mais « in.php » si déjà codé en UTF-8, qui cause des problèmes (corrigez-moi si je me trompe)

Y at-il un moyen, que je puisse lister tous les fichiers dont le codage n'est pas UTF-8?

Répondre

4

Vous ne pouvez pas trouver les fichiers qui sont définitivement ISO-8859-1, mais vous pouvez trouver des fichiers qui sont valides UTF-8 (qui contrairement à la plupart des encodages multi-octets vous donnent une assurance raisonnable qu'ils sont en fait UTF- 8). moreutils a un outil isutf8 qui peut le faire pour vous. Ou vous pouvez écrire le vôtre, ce serait assez simple.

0

Quel type de contenu? XML? Alors oui, si correctement étiqueté en haut. Fichiers texte génériques? Je ne connais pas de moyen a priori de savoir quel encodage est utilisé, bien qu'il soit possible, parfois, avec un code intelligent. "Tagged" fichiers texte UTF-8, par lequel je veux dire les fichiers texte UTF-8 avec un Byte-Order mark? (Pour UTF-8, la séquence de trois octets "ï" ¿") Probablement. Les caractères de l'ordre d'octet communément apparaissent comme les trois premiers caractères d'un fichier codé ISO-8859-1. (Qui bobince a souligné dans un commentaire à ce poste, donc je corrige mon poste.)

Pour votre usage, des outils existent qui peuvent probablement résoudre la plupart de votre question. Logan Capaldo a souligné un en his answer. Mais après tout, s'il était toujours possible de comprendre, sans ambiguïté, quel encodage de caractères était utilisé dans un fichier, l'utilitaire iconv n'aurait pas besoin de vous pour fournir le codage "from". :)

+0

fichiers UTF-8 ne devraient pas « correctement », une nomenclature (bien que dans la pratique, ils le font souvent. Et une nomenclature peut parfaitement exister UTF-8 codé à le début d'un fichier ISO-8859-1 (cela signifierait "ï" ¿") ... c'est très improbable, bien sûr. – bobince

2

Il est souvent difficile de dire simplement en lisant un fichier texte s'il est encodé en UTF-8 ou non. Vous pouvez scanner le fichier pour certains indicator bytes qui ne peuvent jamais se produire en UTF-8, et si vous les trouvez, vous savez que le fichier est en ISO-8859-1. Si vous trouvez un octet avec son bit de poids fort, où les octets immédiatement avant et immédiatement après n'ont pas leur bit de poids fort, vous savez qu'il est codé ISO (car les octets> 127 se produisent toujours dans les séquences en UTF -8). Au-delà de cela, il s'agit essentiellement de conjectures - vous devrez regarder les séquences d'octets avec ce jeu de bits élevé et voir s'il serait logique qu'ils se produisent dans ISO-8859-1 ou non.

Le programme file tentera de deviner l'encodage d'un fichier texte qu'il est en train de traiter, vous pouvez essayer cela.

1

Y at-il un moyen, que je peux répertorier tous les fichiers dont le codage n'est pas UTF-8?

Peut-être pas si facilement dans bash seul, mais c'est une tâche triviale par exemple.Python:

import os.path 

for child in os.path.listdir(TARGETDIR): 
    child= os.path.join(TARGETDIR, child) 
    if os.path.isfile(child): 
     content= open(child, 'rb').read() 

     try: 
      unicode(content, 'utf-8') 
     except UnicodeDecodeError: 
      open(child, 'wb').write(unicode(content, 'iso-8859-1')) 

Cela suppose que tout fichier peut être interprété comme une séquence UTF-8 valide est un (et ne peut donc être laissé seul), alors que tout ce qui est ne doit pas être ISO- 8859-1. Ceci est une hypothèse raisonnable si ces deux sont les seuls codages possibles, car les séquences UTF-8 valides (d'au moins deux caractères de sommets dans un ordre particulier) sont relativement rares dans le texte latin réel, où nous tendent seulement à utiliser les singles singuliers accentués ici et là.

0

avec FIND il est assez simple

find . -print0 | xargs -0 file | grep 8859 
Questions connexes