Comment puis-je suppose que l'encodage d'une chaîne de caractères en Perl?
J'ai une chaîne Unicode et ne sais pas ce que son encodage. Lorsque cette chaîne est lu par un programme Perl, est-il un codage par défaut Perl utilisera? Si oui, comment puis-je savoir ce que c'est?
Je suis en train d'essayer de se débarrasser de caractères non-ASCII à partir de l'entrée. J'ai trouvé ceci sur certains forum qui va le faire:
my $line = encode('ascii', normalize('KD', $myutf), sub {$_[0] = ''});
Comment le travail ci-dessus lorsque aucun encodage en entrée est-elle précisée? Faut-il préciser comme suit?
my $line = encode('ascii', normalize('KD', decode($myutf, 'input-encoding'), sub {$_[0] = ''});
- Corrigez-moi si je me trompe, mais j'ai pensé que le point de l'ensemble de l'Unicode, c'est qu'il n'a pas un "codage" - tout est là.
- Vous n'avez pas une chaîne Unicode. Vous avez un dossier complet d'octets qui représentent une chaîne Unicode dans certains encodage. Si vous ne connaissez pas l'encodage du fichier, puis vérifiez pour un ordre d'octet-marqueur au début du fichier. Si il n'existe pas de NOMENCLATURE, vous êtes hors de la chance.
- On dirait que vous êtes de poser au moins deux questions séparées (1er et 2e alinéas).
- Unicode définit un jeu de caractères. Un encodage du jeu de caractères représente sur le disque. Par exemple, UTF-8 est un encodage.
Vous devez vous connecter pour publier un commentaire.
Trouver dans quel encodage quelque chose d'inconnu utilise, il vous suffit d'essayer et de regarder. Les modules Encode::Détecter et Encode::Devinez automatiser cela. (Si vous avez de la difficulté à compiler Encode::Détecter, tenter sa fourche Encode::Détective à la place.)
Je trouve
encode 'ascii'
est une piètre solution pour se débarrasser des caractères non-ASCII. Tout sera remplacé par le point d'interrogation; c'est trop de perte de qualité pour être utile.Si vous voulez lisible en texte ASCII, je recommande Texte::Unidecode à la place. Cela, aussi, est un codage avec perte, mais pas terrible comme plaine
encode
ci-dessus.Cependant, évitez ceux avec perte codages si vous pouvez l'aider. Dans le cas où vous souhaitez inverser l'opération plus tard, choisir soit l'un des
PERLQQ
ouXMLCREF
.Text::Unidecode
. Qui ne fonctionne pas dans tous les cas.La Coder module a une façon que vous pouvez essayer de le faire. Vous
decode
les premières octets avec ce que vous pensez de l'encodage. Si les octets ne représentent pas un encodage valide, il explose et vous l'attraper avec un eval. Sinon, vous obtenez en retour un correctement chaîne codée. Par exemple:Cela a l'inconvénient que la même séquence d'octets peut être valable dans plusieurs codages
J'ai plus à dire sur ce point dans la prochaine Efficace de Programmation Perl, 2e Édition, qui a un chapitre entier sur la façon de traiter avec Unicode. Je pense que mon éditeur se mettait en colère, si j'ai posté l'ensemble de la chose. 🙂
Vous pouvez également voir Juerd de l'Unicode des Conseils, ainsi que certains de l'Unicode docs qui viennent avec Perl.
Vous pouvez utiliser le code suivant aussi, de chiffrer et de déchiffrer le code