2009-08-05 7 views

Répondre

4

Pas fiable. Voir series de Raymond Chen sur posts sur le sujet.

Le problème est que l'UTF-8 sans nomenclature est trop souvent impossible à distinguer d'un codage ANSI tout aussi valide. Je pense que la plupart des solutions (comme l'API Win32 IsTextUnicode) utilisent diverses heuristiques pour donner une meilleure estimation du format du texte.

+2

Avec une nomenclature, il est toujours impossible de la distinguer. Par conséquent, la nomenclature est inutile en plus d'être activement nuisible. –

6

Vous pouvez tester l'hypothèse qu'il pourrait, mais je crois que vous ne pouvez que finir par savoir que ce n'est pas avec certitude. En d'autres termes, vous pouvez examiner le tampon pour voir si toutes les séquences d'octets sont légales UTF-8, que les points de code sont représentés avec le plus petit nombre d'octets, qu'aucun code de substitution 16 bits n'est présent et ainsi de suite. Un tampon qui passe tous ces critères peut sembler être du texte, mais vous pourriez être dupé. En plus de la discussion de Raymond Chen à Old New Thing citée par la réponse de Mark Pim, le tampon pourrait en fait contenir du code machine x86 qui se trouve limité au sous-ensemble qui semble être ASCII imprimable sur 7 bits. Étonnamment, vous pouvez réellement écrire des programmes significatifs dans ce sous-ensemble, dont un exemple est le virus de test antivirus EICAR.

Bien sûr, un tampon qui contient des séquences d'octets qui sont malformées UTF-8 n'est probablement pas du tout du texte UTF-8. Dans ce cas, vous avez un haut degré de confiance. Ensuite, l'astuce consiste à déterminer quel encodage il pourrait être réellement.

Si vous savez (ou pouvez supposer) quelque chose sur le contenu sémantique du tampon, vous pouvez également l'utiliser pour soutenir votre détermination. Par exemple, si le tampon est censé contenir du texte en anglais, il est hautement improbable qu'il contienne des points de code en coréen, et il devrait généralement être orthographié correctement, suivre la grammaire anglaise, et ainsi de suite. Cela peut être cher à tester, bien sûr ...

0

Pour rapide et sale, vous ne pouvez pas faire beaucoup mieux que la regex sur this page. Si vous voulez juste savoir s'il est sûr de décoder les octets comme UTF-8, c'est tout ce dont vous avez besoin.

0

Vérifiez simplement que la séquence d'octets est valide en UTF-8. Si c'est le cas, la probabilité qu'il s'agisse d'un texte significatif dans tout autre codage est essentiellement zéro.

Questions connexes