Dans notre application, nous recevons des fichiers texte ( .txt
, .csv
, etc.) provenant de sources diverses. Lors de la lecture, ces fichiers contiennent parfois des déchets, car les fichiers ont été créés dans une page de code différente / inconnue.
Existe-t-il un moyen de détecter (automatiquement) la page de code d'un fichier texte?
Le detectEncodingFromByteOrderMarks
, le StreamReader
constructeur, travaille pour UTF8
et d' autres fichiers marqués unicode, mais je suis à la recherche d'un moyen de détecter les pages de code, comme ibm850
, windows1252
.
Merci pour vos réponses, c'est ce que j'ai fait.
Les fichiers que nous recevons proviennent d'utilisateurs finaux, ils n'ont aucune idée des pages de codes. Les récepteurs sont également des utilisateurs finaux, c'est maintenant ce qu'ils savent des pages de codes: les pages de codes existent et sont ennuyeuses.
Solution:
- Ouvrez le fichier reçu dans le Bloc-notes, regardez un morceau de texte tronqué. Si quelqu'un s'appelle François ou quelque chose, avec votre intelligence humaine, vous pouvez le deviner.
- J'ai créé une petite application que l'utilisateur peut utiliser pour ouvrir le fichier et saisir un texte dont l'utilisateur sait qu'il apparaîtra dans le fichier, lorsque la bonne page de code est utilisée.
- Parcourez toutes les pages de code et affichez celles qui donnent une solution avec le texte fourni par l'utilisateur.
- Si plusieurs pages de code apparaissent, demandez à l'utilisateur de spécifier plus de texte.
Si vous cherchez à détecter des encodages non UTF (c.-à-d. Pas de nomenclature), vous êtes essentiellement à l'heuristique et à l'analyse statistique du texte. Vous voudrez peut-être jeter un œil au document de Mozilla sur la détection de jeu de caractères universel ( même lien, avec un meilleur formatage via Wayback Machine ).
la source
Avez-vous essayé le port C # pour Mozilla Universal Charset Detector
Exemple de http://code.google.com/p/ude/
la source
private Encoding GetEncodingFromString(string encoding) { try { return Encoding.GetEncoding(encoding); } catch { return Encoding.ASCII; } }
C'est clairement faux. Chaque navigateur Web dispose d'une sorte de détecteur de jeu de caractères universel pour traiter les pages qui n'ont aucune indication sur l'encodage. Firefox en a un. Vous pouvez télécharger le code et voir comment il le fait. Voir une documentation ici . Fondamentalement, c'est une heuristique, mais qui fonctionne vraiment bien.
Étant donné une quantité raisonnable de texte, il est même possible de détecter la langue.
Voici un autre que je viens de trouver en utilisant Google:
la source
a character encoding declaration is required even if the encoding is US-ASCII
- une déclaration manquante se traduit par l'utilisation d'un algorithme heuristique, et non par le repli sur UTF8.Je sais qu'il est très tard pour cette question et cette solution ne plaira pas à certains (en raison de son biais centré sur l'anglais et de son manque de tests statistiques / empiriques), mais cela a très bien fonctionné pour moi, en particulier pour le traitement des données CSV téléchargées:
http://www.architectshack.com/TextFileEncodingDetector.ashx
Avantages:
Remarque: c'est moi qui ai écrit ce cours, alors prenez-le évidemment avec un grain de sel! :)
la source
Notepad ++ a cette fonctionnalité prête à l'emploi. Il prend également en charge le changement.
la source
Vous cherchez une solution différente, j'ai trouvé que
https://code.google.com/p/ude/
cette solution est un peu lourde.
J'avais besoin d'une détection de codage de base, basée sur 4 premiers octets et probablement une détection de jeu de caractères xml - j'ai donc pris un exemple de code source sur Internet et ajouté une version légèrement modifiée de
http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html
écrit pour Java.
Il suffit de lire probablement les 1024 premiers octets du fichier, mais je charge le fichier entier.
la source
Si quelqu'un cherche une solution à 93,9%. Cela fonctionne pour moi:
la source
J'ai fait quelque chose de similaire en Python. Fondamentalement, vous avez besoin de beaucoup d'exemples de données provenant de divers encodages, qui sont décomposés par une fenêtre coulissante à deux octets et stockés dans un dictionnaire (hachage), saisis sur des paires d'octets fournissant des valeurs de listes d'encodages.
Étant donné ce dictionnaire (hachage), vous prenez votre texte d'entrée et:
Si vous avez également des textes UTF codés qui n'échantillonniez pas commencent par une nomenclature, la deuxième étape couvrira ceux qui a glissé de la première étape.
Jusqu'à présent, cela fonctionne pour moi (les données d'échantillon et les données d'entrée suivantes sont des sous-titres dans diverses langues) avec des taux d'erreur décroissants.
la source
L'outil "uchardet" le fait bien en utilisant des modèles de distribution de fréquence de caractères pour chaque jeu de caractères. Les fichiers plus gros et les fichiers plus «typiques» ont plus de confiance (évidemment).
Sur ubuntu, vous venez
apt-get install uchardet
.Sur d'autres systèmes, obtenez la source, l'utilisation et les documents ici: https://github.com/BYVoid/uchardet
la source
brew install uchardet
Le constructeur de la classe StreamReader prend un paramètre 'detect encoding'.
la source
Si vous pouvez créer un lien vers une bibliothèque C, vous pouvez utiliser
libenca
. Voir http://cihar.com/software/enca/ . Depuis la page de manuel:C'est GPL v2.
la source
Vous avez le même problème mais vous n'avez pas encore trouvé de bonne solution pour le détecter automatiquement. Maintenant, j'utilise PsPad (www.pspad.com) pour cela;) Fonctionne bien
la source
Comme il s'agit essentiellement d'heuristique, il peut être utile d'utiliser le codage des fichiers reçus précédemment de la même source comme premier indice.
La plupart des gens (ou applications) font des choses à peu près dans le même ordre à chaque fois, souvent sur la même machine, il est donc très probable que lorsque Bob crée un fichier .csv et l'envoie à Mary, il utilisera toujours Windows-1252 ou quelle que soit sa machine par défaut.
Dans la mesure du possible, un peu de formation client ne fait jamais de mal non plus :-)
la source
En fait, je cherchais un moyen générique, pas de programmation, de détecter l'encodage des fichiers, mais je ne l'ai pas encore trouvé. Ce que j'ai trouvé en testant avec différents encodages, c'est que mon texte était UTF-7.
Donc là où je faisais pour la première fois: StreamReader file = File.OpenText (fullfilename);
J'ai dû le changer en: StreamReader file = new StreamReader (fullfilename, System.Text.Encoding.UTF7);
OpenText suppose que c'est UTF-8.
vous pouvez également créer le StreamReader comme ce nouveau StreamReader (fullfilename, true), le deuxième paramètre signifiant qu'il devrait essayer de détecter l'encodage à partir du byteordermark du fichier, mais cela n'a pas fonctionné dans mon cas.
la source
Ouvrez le fichier dans AkelPad (ou copiez / collez simplement un texte tronqué), allez dans Edition -> Sélection -> Recoder ... -> cochez "Détection automatique".
la source
En tant qu'addon à ITmeze, j'ai utilisé cette fonction pour convertir la sortie du port C # pour Mozilla Universal Charset Detector
MSDN
la source
Merci @ Erik Aronesty d' avoir mentionné
uchardet
.Pendant ce temps , l'outil (? Même) existe pour Linux:
chardet
.Ou, sur Cygwin vous pouvez utiliser:
chardetect
.Voir: page de manuel chardet: https://www.commandlinux.com/man-page/man1/chardetect.1.html
Cela détectera (devinera) heuristiquement l'encodage des caractères pour chaque fichier donné et rapportera le nom et le niveau de confiance pour l'encodage des caractères détecté de chaque fichier.
la source
J'utilise ce code pour détecter la page de code ansi par défaut Unicode et Windows lors de la lecture d'un fichier. Pour les autres codages, une vérification du contenu est nécessaire, manuellement ou par programmation. Cela peut être utilisé pour enregistrer le texte avec le même encodage que lors de son ouverture. (J'utilise VB.NET)
la source
10Y (!) S'est écoulé depuis que cela a été demandé, et je ne vois toujours aucune mention de la bonne solution non GPL de MS: IMultiLanguage2 API.
La plupart des bibliothèques déjà mentionnées sont basées sur l'UDE de Mozilla - et il semble raisonnable que les navigateurs aient déjà abordé des problèmes similaires. Je ne sais pas quelle est la solution de chrome, mais depuis IE 5.0 MS a publié la leur, et c'est:
C'est un appel COM natif, mais voici un très bon travail de Carsten Zeumer, qui gère le désordre d'interopérabilité pour l'utilisation de .net. Il y en a d'autres, mais dans l'ensemble, cette bibliothèque n'obtient pas l'attention qu'elle mérite.
la source