Comment identifier le contenu du fichier en tant qu’ASCII ou binary

Comment identifiez-vous le contenu du fichier comme étant en ASCII ou en binary en utilisant C ++?

Si un fichier ne contient que les octets décimaux 9–13, 32–126, il s’agit probablement d’un fichier texte ASCII pur. Sinon, ce n’est pas. Cependant, il peut toujours s’agir de texte dans un autre encodage.

Si, en plus des octets ci-dessus, le fichier ne contient que les octets décimaux 128–255, il s’agit probablement d’un fichier texte codé selon la norme ASCII 8 bits ou de longueur variable, tel que ISO-8859-1, UTF-8 ou ASCII + Big5. Sinon, vous pourrez peut-être vous arrêter ici et considérer le fichier comme étant binary. Cependant, il peut toujours s’agir d’un texte codé sur 16 ou 32 bits.

Si un fichier ne respecte pas les contraintes ci-dessus, examinez les 2 à 4 premiers octets du fichier pour un repère d’ordre d’octet :

  • Si les deux premiers octets sont des entités hexadécimales FE FF , le fichier est provisoirement UTF-16 BE.
  • Si les deux premiers octets sont des entités hexadécimales FF FE et que les deux octets suivants ne sont pas des entités hexadécimales 00 00 , le fichier est provisoirement UTF-16 LE.
  • Si les quatre premiers octets sont au format hex 00 00 FE FF , le fichier est provisoirement au format UTF-32 BE.
  • Si les quatre premiers octets sont hexadécimaux FF FE 00 00 , le fichier est provisoirement UTF-32 LE.

Si, grâce aux vérifications ci-dessus, vous avez déterminé un codage provisoire, vérifiez uniquement le codage correspondant ci-dessous, afin de vous assurer que le fichier n’est pas un fichier binary correspondant à une marque d’ordre d’octets.

Si vous n’avez pas déterminé de codage provisoire, le fichier peut toujours être un fichier texte dans l’un de ces codages, car la marque d’ordre des octets n’est pas obligatoire. Vérifiez donc tous les codages dans la liste suivante:

  • Si le fichier ne contient que des mots big-endian de deux octets avec les valeurs décimales 9-13, 32-126 et 128 ou supérieures, le fichier est probablement UTF-16 BE.
  • Si le fichier ne contient que des mots de deux octets little-endian avec les valeurs décimales 9-13, 32-126 et 128 ou supérieures, il s’agit probablement du fichier UTF-16 LE.
  • Si le fichier ne contient que des mots big-endian de quatre octets avec les valeurs décimales 9-13, 32-126 et 128 ou supérieures, il s’agit probablement du fichier UTF-32 BE.
  • Si le fichier ne contient que des mots de quatre octets little-endian avec les valeurs décimales 9-13, 32-126 et 128 ou supérieures, il s’agit probablement du fichier UTF-32 LE.

Si, après toutes ces vérifications, vous n’avez toujours pas déterminé d’encodage, le fichier n’est pas un fichier texte dans tout encodage basé sur ASCII que je connaisse, aussi, dans la plupart des cas, vous pouvez probablement le considérer comme étant binary être un fichier texte dans un codage non-ASCII tel que EBCDIC, mais je soupçonne que cela sort du cadre de votre préoccupation).

Vous parcourez-le en utilisant une boucle normale avec stream.get () et vérifiez si les valeurs d’octet que vous lisez sont <= 127 . Une façon de faire:

 int c; std::ifstream a("file.txt"); while((c = a.get()) != EOF && c <= 127) ; if(c == EOF) { /* file is all ASCII */ } 

Cependant, comme quelqu'un l'a mentionné, tous les fichiers sont des fichiers binarys. De plus, ce que vous entendez par "ascii" n'est pas clair. Si vous voulez parler du code du personnage, alors c'est bien ainsi que vous allez. Mais si vous ne parlez que de valeurs alphanumériques, vous aurez besoin d’une autre méthode.

Mon éditeur de texte décide de la présence d’octets nuls. En pratique, cela fonctionne vraiment bien: un fichier binary sans octets nuls est extrêmement rare.

Regardez comment fonctionne la commande de fichier . Il existe trois stratégies pour déterminer le type d’un fichier:

  • tests du système de fichiers
  • tests de nombre magique
  • et tests de langue

En fonction de votre plate-forme et des fichiers susceptibles de vous intéresser, vous pouvez regarder son implémentation, voire l’invoquer.

Le contenu de chaque fichier est binary. Donc, ne sachant rien d’autre, vous ne pouvez pas être sûr.

ASCII est une question d’interprétation. Si vous ouvrez un fichier binary dans un éditeur de texte, vous voyez ce que je veux dire.

La plupart des fichiers binarys contiennent un en-tête fixe (par type) que vous pouvez rechercher ou vous pouvez utiliser l’extension de fichier comme indice. Vous pouvez rechercher des marques d’ordre des octets si vous attendez des fichiers au format UTF, mais ils sont également facultatifs.

Si vous ne définissez pas votre question de manière plus précise, il ne peut y avoir de réponse définitive.

Si la véritable question est de savoir comment détecter uniquement l’ASCII, alors la réponse de litb est exacte. Cependant, si san voulait savoir si le fichier contient du texte ou non, le problème devient alors beaucoup plus complexe. L’ASCII n’est qu’un moyen – de plus en plus impopulaire – de représenter un texte. Les systèmes Unicode – UTF16, UTF32 et UTF8 ont gagné en popularité. En théorie, ils peuvent être facilement testés en vérifiant si les deux premiers octets sont la marque BOM 0xFEFF (ou 0xFFFE si le compteur est unishell) (ou si 0xFFFE si l’ordre des octets est inversé). Cependant, comme ces deux octets bousillent de nombreux formats de fichiers pour les systèmes Linux, ils ne peuvent pas être garantis. De plus, un fichier binary peut commencer par 0xFEFF.

Rechercher 0x00 (ou d’autres caractères de contrôle) ne vous aidera pas non plus si le fichier est unicode. Si le fichier est UFT16, par exemple, et que le fichier contient du texte anglais, tous les autres caractères seront 0x00.

Si vous connaissez la langue dans laquelle le fichier texte sera écrit, il serait alors possible d’parsingr les octets et de déterminer statistiquement s’il contient du texte ou non. Par exemple, la lettre la plus courante en anglais est E suivie de T. Ainsi, si le fichier contient beaucoup plus de E et de T que de Z et de X, il s’agit probablement de texte. Bien sûr, il serait nécessaire de tester cela en ASCII et les différents unicodes pour en être sûr.

Si le fichier n’est pas écrit en anglais – ou si vous souhaitez prendre en charge plusieurs langues -, il ne vous rest plus qu’à examiner l’extension de fichier sous Windows et à vérifier les quatre premiers octets par rapport à une firebase database de codes “fichier magique”. détermine le type du fichier et donc s’il contient du texte ou non.

Cela dépend de votre définition d’ASCII. Vous pouvez soit vérifier les valeurs avec le code ASCII <128, soit définir un jeu de caractères que vous définissez (par exemple, 'a' - 'z', 'A' - 'Z', '0' - '9' ...) et traiter le fichier. binaire s'il contient d'autres caractères.

Vous pouvez également rechercher des sauts de ligne normaux (0x10 ou 0x13,0x10) pour détecter les fichiers texte.

Pour vérifier, vous devez ouvrir le fichier en tant que binary. Vous ne pouvez pas ouvrir le fichier en tant que texte. ASCII est effectivement un sous-ensemble de binary. Après cela, vous devez vérifier les valeurs d’octet. ASCII a les valeurs d’octet 0-127, mais 0-31 sont des caractères de contrôle. TAB, CR et LF sont les seuls caractères de contrôle communs. Vous ne pouvez pas (de manière portable) utiliser ‘A’ et ‘Z’; il n’y a aucune garantie qu’ils soient en ASCII (!). Si vous en avez besoin, vous devrez définir.

 const unsigned char ASCII_A = 0x41; // NOT 'A' const unsigned char ASCII_Z = ASCII_A + 25; 

Cette question n’a vraiment pas de bonne ou de mauvaise réponse, mais des solutions complexes qui ne fonctionneront pas pour tous les fichiers texte possibles.

Voici un lien qui explique comment le bloc-notes détecte le type de fichier ascii. Ce n’est pas parfait, mais il est intéressant de voir comment Microsoft s’en occupe.

Le linguiste de Github utilise charlock holmes pour détecter les fichiers binarys, lesquels utilisent à leur tour la détection de charset d’ ICU .

La bibliothèque ICU est disponible pour de nombreux langages de programmation, y compris C et Java.