J'ai plusieurs .htm
fichiers qui s'ouvrent dans Gedit sans aucun avertissement / erreur, mais lorsque j'ouvre ces mêmes fichiers Jedit
, cela m'avertit d'un encodage UTF-8 invalide ...
La balise méta HTML indique "charset = ISO-8859-1". Jedit autorise une liste des codages de secours et une liste des auto-détecteurs de codage (actuellement "BOM XML-PI"), ainsi mon problème immédiat a été résolu. Mais cela m'a fait penser à: Et si les métadonnées n'étaient pas là?
Lorsque les informations de codage ne sont tout simplement pas disponibles, existe-t-il un programme CLI qui permet de "deviner au mieux" les codages pouvant s'appliquer?
Et, bien que ce soit un problème légèrement différent; Existe-t-il un programme CLI qui teste la validité d'un encodage connu ?
Réponses:
La
file
commande fait des "suppositions" sur l'encodage. Utilisez le-i
paramètre pour forcer l’file
impression d’informations sur le codage.Manifestation:
Voici comment j'ai créé les fichiers:
De nos jours, tout est utf-8. Mais convaincez-vous:
Comparez avec https://en.wikipedia.org/wiki/Ä#Computer_encoding
Convertir les autres encodages:
Vérifiez le vidage hexadécimal:
Créez quelque chose d'invalide en mélangeant les trois:
Ce qui
file
dit:sans
-i
:La
file
commande n'a aucune idée de "valide" ou "invalide". Il ne voit que quelques octets et essaie de deviner ce que l'encodage pourrait être. En tant qu'êtres humains, nous pourrions être en mesure de reconnaître qu'un fichier est un fichier texte avec quelques trémas dans un "mauvais" codage. Mais en tant qu'ordinateur, il aurait besoin d'une sorte d'intelligence artificielle.On pourrait soutenir que l'heuristique de
file
est une sorte d'intelligence artificielle. Pourtant, même si c'est le cas, il s'agit d'un projet très limité.Voici plus d'informations sur la
file
commande: http://www.linfo.org/file_command.htmlla source
, but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1.
file -i` rapportéunknown-8bit
. Donc, cela semble aussi être la réponse à: "Comment détecter un encodage invalide / inconnu"file -I
avec un «i» majuscule au lieu de minuscule.Il n'est pas toujours possible de savoir avec certitude quel est l'encodage d'un fichier texte. Par exemple, la séquence d'octets
\303\275
(c3 bd
en hexadécimal) peut êtreý
en UTF-8, ouý
en latin1, ouĂ˝
en latin2, ou羸
en BIG-5, etc.Certains encodages ont des séquences d'octets non valides, il est donc possible de les écarter. Cela est vrai en particulier pour UTF-8; la plupart des textes dans la plupart des encodages 8 bits ne sont pas valides UTF-8. Vous pouvez tester UTF-8 valide avec
isutf8
de moreutils ou aveciconv -f utf-8 -t utf-8 >/dev/null
, entre autres.Il existe des outils qui tentent de deviner l'encodage d'un fichier texte. Ils peuvent faire des erreurs, mais ils fonctionnent souvent dans la pratique tant que vous n'essayez pas délibérément de les duper.
file
Encode::Guess
(partie de la distribution standard) tente des encodages successifs sur une chaîne d'octets et renvoie le premier encodage dans lequel la chaîne est un texte valide.S'il y a des métadonnées (HTML / XML
charset=
, TeX\inputenc
, emacs-*-coding-*-
,…) dans le fichier, les éditeurs avancés comme Emacs ou Vim sont souvent en mesure d'analyser ces métadonnées. Ce n'est pas facile à automatiser à partir de la ligne de commande cependant.la source
iconv
, je viens d'exécuter tous les 1168 encodages (y compris les alias) répertoriés par l'iconv -l
un de mes fichiers .htm. ... Il y a eu 683 encodages qui ont réussi à rassembler .. Le jeu de caractères actuel du fichier = ISO-8859-1 .. composé de toutes les valeurs de la plage ASCII de la barre une .. Le caractère non-ASCII était \ xA9.Aussi au cas où vous classez -i vous donne inconnu
Vous pouvez utiliser cette commande php qui peut deviner un jeu de caractères comme ci-dessous:
En php, vous pouvez vérifier comme ci-dessous:
Spécifier explicitement la liste de codage:
" Mb_list_encodings " plus précis :
Ici, dans le premier exemple, vous pouvez voir que je mets une liste de codages (détection de la liste) susceptibles de correspondre. Pour obtenir un résultat plus précis, vous pouvez utiliser tous les encodages possibles via: mb_list_encodings ()
Remarque les fonctions mb_ * nécessitent php-mbstring
Voir la réponse: https://stackoverflow.com/a/57010566/3382822
la source