2010-01-12 3 views

Répondre

4

is_utf8 teste si l'indicateur Perl utf8 est activé ou non. Il est possible qu'un scalaire contienne correctement utf-8 et que le drapeau ne soit pas activé. Je pense qu'il est possible d'activer délibérément le drapeau même avec un utf-8 mal formé, mais je ne suis pas sûr.

Pour vérifier si le scalaire contient des données UTF-8, vous devez vérifier le drapeau, et si ce n'est pas, essayez aussi quelque chose comme

eval { 
    my $utf8 = decode_utf8 ($scalar); 
} 

puis vérifier les erreurs dans [email protected].

Pour vérifier si un scalaire non-UTF-8 contient des données non-ASCII, votre idée $scalar =~ m/\A [[:ascii:]]* \Z/xms semble correcte.

+1

Ceci est encore un autre exemple d'une réponse correcte sur une question Perl étant downvoted (deux fois). –

2

Le meilleur meilleur, de toute évidence, est de simplement garder la trace lorsque vous lisez les données. Vous, en tant que programmeur, devriez déjà savoir si vous obtenez du texte (et de son encodage) ou des données binaires. Lorsque vous lisez du texte, vous le voyez (voir http://p3rl.org/UNI pour plus de détails) dans les chaînes de texte Perl.

Si vous ne savez vraiment pas à l'avance, les -T and -B file tests offrent une heuristique. Ne tenez pas compte de la réponse de Kinopiko, dans la grande majorité des cas, vous ne devriez pas avoir besoin de connaître la représentation interne des données, et ne pas utiliser les fonctions utilitaires du module utf8 pragma est une mauvaise approche.

+0

Je ne pense pas que vous ayez réfléchi à cela. Il est très possible qu'un auteur de module, par exemple, ait besoin de savoir si les données sont en UTF-8 ou non. –

+1

Je ne pense pas que vous sachiez de quoi vous parlez. La documentation de 'utf8' indique elle-même que ses fonctions sont à portée de main, donc il est généralement incorrect de recommander leur utilisation. Ne le lis pas. Distinguer ce fait est justifié, et je trouve que les représailles insignifiantes à cause de la dévaluation de votre part sont mauvaises. (suite) – daxim

+2

Pour exposer mon argument: Un auteur sait s'il s'agit de données textuelles ou binaires car vous ne pouvez pas avoir le même chemin de code pour les deux et les traiter de la même manière; par exemple. Unpack est pour binaire seulement, et ucFirst est pour le texte seulement. Maintenant, si le __encoding__ du texte est inconnu, c'est un sujet complètement différent, et sa solution est 'Encode :: Detect'. – daxim

Questions connexes