Convertir une chaîne UTF8 en ASCII en Perl
J'ai tout essayé Google et StackOverflow ont recommandé (que j'ai pu trouver), y compris à l'aide de l'encodage. Mon code fonctionne, mais il utilise juste UTF8 et j'obtiens le caractère large avertissements. Je sais comment travailler autour de ces mises en garde, mais je ne suis pas en utilisant UTF8 pour quoi que ce soit d'autre donc j'aimerais le convertir et ne pas avoir à adapter le reste de mon code de traiter avec elle. Voici mon code:
my $xml = XMLin($content);
# Populate the @titles array with each item title.
my @titles;
for my $item (@{$xml->{channel}->{item}}) {
my $title = Encode::decode_utf8($item->{title});
#my $title = $item->{title};
#utf8::downgrade($title, 1);
Encode::from_to($title, 'utf8', 'iso-8859-1');
push @titles, $title;
}
return @titles;
Commentée vous pouvez voir quelques autres choses que j'ai essayé. Je suis bien conscient que je ne sais pas ce que je fais ici. J'ai juste envie de finir avec un simple vieux chaîne de caractères ASCII. Toutes les idées seraient grandement appréciés. Merci.
source d'informationauteur Mark C
Vous devez vous connecter pour publier un commentaire.
La réponse dépend de la façon dont vous souhaitez utiliser le titre. Il y a 3 façons de le faire:
C'est le format qui doit être utilisée si vous souhaitez stocker l'UTF-8 chaîne codée en dehors de votre application, que ce soit sur le disque ou l'envoi sur le réseau ou quoi que ce soit à l'extérieur de la portée de votre programme.
Le concept de caractères est interne à Perl. Lorsque vous effectuez
Encode::decode_utf8
puis un groupe d'octets est tenté d'être convertie en une chaîne de caractères, comme on le voit par Perl. Le Perl VM (et le programmeur d'écrire du code Perl) ne peut pas externaliser cette notion, sauf par l'intermédiaire de décodage UTF-8 octets d'entrée et de les encoder en UTF-8 octets de sortie. Par exemple, votre programme reçoit deux octets en entrée que vous savez qu'ils représentent codé en UTF-8 du caractère(s), disons0xC3 0xB6
. Dans ce casdecode_utf8
retourne une représentation qui, au lieu de deux octets, voit un personnage:ö
.Vous pouvez alors procéder à manipuler la chaîne dans Perl. Pour illustrer la différence en outre, considérons le code suivant:
Le cas particulier de l'ASCII, un sous-ensemble de l'UTF-8.
ASCII est un sous-ensemble très restreint de l'Unicode, où les personnages dans cette gamme sont représentés par un seul octet. La conversion d'Unicode en ASCII est un endroit de perte de qualité de fonctionnement, comme la plupart des caractères Unicode ne sont pas des caractères ASCII. Soit vous êtes contraint à l'abandon, chaque personnage de votre chaîne qui n'est pas en ASCII ou d'essayer de carte à partir d'un caractère Unicode pour leurs plus proches équivalents ASCII (ce qui n'est pas possible dans la grande majorité des cas), lors de la tentative de forcer une chaîne Unicode en ASCII.
Puisque vous disposez d'un grand caractère avertissements, cela signifie que vous essayez de les manipuler (éventuellement de sortie) des caractères Unicode qui ne peut pas être représenté comme ASCII ou ISO-8859-1.
Si vous n'avez pas besoin de manipuler le titre de votre document XML comme un string, je vous suggère de la laisser octets UTF-8 (je devais mentionner que vous devez être prudent de ne pas mélanger les octets et les caractères dans les chaînes). Si vous avez besoin de les manipuler, puis de décoder, de manipuler, et sur la sortie de l'encoder en UTF-8.
Pour de plus amples informations, veuillez utiliser
perldoc
à l'étudeperlunitut
perlunifaq
perlunicode
perluniintro
etEncodage
.Bien que c'est une vieille question, je viens de passer plusieurs heures (!) essaie de faire plus ou moins la même chose! C'est: lire des données à partir d'un UTF-8 fichier XML, et de convertir les données dans le Windows-1252 page de codes (je pourrais aussi avoir utilisé Latin1, ISO-8859-1, etc.) afin d'être en mesure de créer des noms de fichiers avec des lettres accentuées.
Après beaucoup d'expérimentation, et même plus recherches, j'ai enfin réussi à obtenir la conversion de travail. Le "truc" consiste à utiliser Encode::encoder au lieu de Coder::décoder.
Par exemple, vu le code dans la question d'origine, le bon (ou au moins un 🙂 moyen de convertir du format UTF-8 serait:
ou
ou
J'espère que cela aide les autres à avoir des problèmes similaires!
Vous pouvez utiliser la ligne suivante pour simplement se débarrasser de l'avertissement. Cela suppose que vous voulez utiliser l'utf-8, ce qui ne devrait normalement pas être un problème.
binmode(STDOUT, ":encoding(utf8)");