7
votes

Détecter le contenu du fichier UTF-16

est-il possible de savoir si un fichier comporte unicode (16 octets par char) ou une teneur ascii 8 bits?


0 commentaires

8 Réponses :



1
votes

Si le fichier pour lequel vous devez résoudre ce problème est suffisamment long à chaque fois, et que vous avez certains idée de ce qu'il est censé être (dire, texte anglais dans unicode ou texte anglais dans ASCII) , vous pouvez effectuer une analyse de fréquence simple sur les caractères et voir si la distribution ressemble à celle de ASCII ou d'UNICODE.


0 commentaires


2
votes

Tout d'abord, ASCII est 7 bits, donc si un octet a son jeu de bits élevé, vous savez que le fichier n'est pas ASCII.

Les différents ensembles de caractères "communs" tels que ISO-8859-X, Windows-1252, etc. sont 8 bits, donc si tous les autres octets sont 0, vous savez que vous traitez avec Unicode qui utilise uniquement la ISO-8859 caractères.

Vous rencontrez des problèmes dans lesquels vous essayez de distinguer entre Unicode et un encodage tel que UTF-8. Dans ce cas, presque tous les octets auront une valeur, vous ne pouvez donc pas prendre une décision facile. Vous pouvez, comme le dit Pascal, faites une sorte d'analyse statistique du contenu: l'arabe et le grec ancien ne seront probablement pas dans le même fichier. Cependant, c'est probablement plus de travail que ça vaut la peine.


Modifier en réponse au commentaire de l'OP:

i pense qu'il suffira de vérifier la présence de 0-valeurs octets (ASCII NUL) dans votre contenu et faites le choix en fonction de cela. La raison en est que les mots-clés JavaScript sont ASCII et ASCII est un sous-ensemble de Unicode. Par conséquent, toute représentation Unicode de ces mots-clés consistera en un octet contenant le caractère ASCII (bas octet) et un autre contenant 0 (l'octet élevé).

Mon cavalier est que vous lisez attentivement la documentation pour vous assurer que leur utilisation du mot "Unicode" est correcte (j'ai regardé Cette page pour comprendre la fonction, n'a plus cherché).


1 commentaires

Je dois choisir entre js_compilescript () et JS_CompileCscript () pour compiler des fichiers JavaScript pour mon emboîtement native ( Code.google .com / p / jslibs )



0
votes

Pour votre cas d'utilisation spécifique, il est très facile de le dire. Il suffit de numériser le fichier, si vous trouvez n'importe quel null ("\ 0"), il doit être UTF-16. Javascript devait avoir des caractères ASCII et ils sont représentés par un 0 précédent dans UTF-16.


0 commentaires

4
votes

Idito à ce que Brian Agnew a déclaré à propos de la lecture du Byte Commande Mark , une spéciale deux octets pouvant apparaître au début du fichier.

Vous pouvez également savoir s'il s'agit d'ASCII en numérisant chaque octet dans le fichier et en voyant s'ils sont tous inférieurs à 128. S'ils sont tous inférieurs à 128, il s'agit simplement d'un fichier ASCII. Si certains d'entre eux sont plus de 128 ans, il y a un autre encodage là-bas.


0 commentaires

4
votes

Les caractères UTF-16 sont tous au moins 16 bits, certains étant 32 bits avec le préfixe droit (0xE000 à 0xFFFF). Alors, il suffit de numériser chaque caractère pour voir si moins de 128 ne fonctionnera pas. Par exemple, les deux octets 0x20 0x20 coderaient dans ASCII et UTF-8 pour deux espaces, mais codent dans UTF-16 pour un seul caractère 0x2020 (Dague). Si le texte est connu pour être l'anglais avec le caractère occasionnel non ASCII, la plupart des autres octets seront nuls. Mais sans certaines connaissances APIORI sur le texte et / ou son codage, il n'y a pas de solution fiable distinguant une chaîne ASCII générale d'une chaîne General UTF-16.


0 commentaires

1
votes

Pour discerner par programme le type d'un fichier - y compris, mais pas limité au codage - le meilleur pari est d'utiliser libmagique . BSD-licencié, il fait partie de tout chaque système UNIX que vous êtes sur le point de rencontrer, mais pour un moindre, vous pouvez l'incliner avec votre application.

Détection du type MIME de C, par exemple, est aussi simple que possible. : xxx

D'autres langues ont leurs propres modules enveloppant cette bibliothèque.

retour à votre question, voici ce que je reçois du fichier (1 ) (l'interface de ligne de commande à libmagique (3) ): xxx


0 commentaires