est-il possible de savoir si un fichier comporte unicode (16 octets par char) ou une teneur ascii 8 bits? p>
8 Réponses :
vous peut em> être capable de lire un byte-commande-mark < / a>, si le fichier a ce présent. p>
Si le fichier pour lequel vous devez résoudre ce problème est suffisamment long à chaque fois, et que vous avez certains em> 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. P>
Unicode est un alphabet, pas un codage. Vous vouliez probablement dire UTF-16. Il y a beaucoup de bibliothèques autour (Python-Chardet me vient à l'esprit instantanément) à l'encodage automatique du texte, bien qu'ils utilisent tous des heuristiques. P>
Malheureusement, Microsoft a vraiment confondu ce problème en appelant systématiquement le codage de l'UTF-16le "Unicode".
Unicode n'est pas un alphabet. C'est un codage, qui code de nombreux alphabets. Pensez-y comme une cartographie des alphabets à une représentation de ces alphabets sous forme numérique.
Unicode n'est ni un alphabet ni un codage, mais un jeu de caractères codé, offrant plusieurs codages de caractères (UTF-8, UTF-16 et UTF-32).
Dois-je être en désaccord une fois de plus? Ce n'est pas un alphabet, un codage ou un jeu de caractères codé en tant que ISO / EIC 10646, mais une norme pour le codage, la manipulation et la représentation des systèmes d'écriture. En plus de l'ensemble de caractères, Unicode ajoute des règles de collation, de normalisation des formulaires et de l'algorithme bidirectionnel pour les scripts de droite à gauche tels que l'arabe et l'hébreu. en.wikipedia.org/wiki/...
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. P>
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. P>
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. P>
Modifier en réponse au commentaire de l'OP: P>
i pense em> 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é). P>
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é). P>
Je dois choisir entre js_compilescript () et JS_CompileCscript () pour compiler des fichiers JavaScript pour mon emboîtement native ( Code.google .com / p / jslibs )
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. P>
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. P>
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. P>
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. P>
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. : p> D'autres langues ont leurs propres modules enveloppant cette bibliothèque. P> retour à votre question, voici ce que je reçois du fichier (1 ) code> (l'interface de ligne de commande à
libmagique (3) code>): p>