GoGPT Best VPN GoSearch

Icône de favori OnWorks

perlunifaq - En ligne dans le Cloud

Exécutez perlunifaq dans le fournisseur d'hébergement gratuit OnWorks sur Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

Il s'agit de la commande perlunifaq qui peut être exécutée dans le fournisseur d'hébergement gratuit OnWorks en utilisant l'un de nos nombreux postes de travail en ligne gratuits tels que Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

PROGRAMME:

Nom


perlunifaq - FAQ sur Perl Unicode

Q et A


Ceci est une liste de questions et réponses sur Unicode en Perl, destinée à être lue après
parlunité.

perlunité n'est pas vraiment a Unicode Didacticiel, is il?
Non, et ce n’est pas vraiment une FAQ Unicode.

Perl dispose d'une interface abstraite pour tous les encodages de caractères pris en charge, c'est donc
En fait, il s'agit d'un tutoriel générique sur « Encode » et d'une FAQ sur « Encode ». Mais beaucoup pensent qu'Unicode
est spécial et magique, et je ne voulais pas les décevoir, alors j'ai décidé d'appeler le
documenter un tutoriel Unicode.

Organisateur Ce que caractère encodages ne Perl soutien?
Pour savoir quels encodages de caractères votre Perl prend en charge, exécutez :

perl -MEncode -le "imprimer pour Encode->encodings(':all')"

Laquelle version of perl devrait I utiliser?
Si possible, passez à la version la plus récente, mais certainement à la version 5.8.1 ou ultérieure. Le tutoriel
et la FAQ supposent la dernière version.

Vous devriez également vérifier vos modules et les mettre à niveau si nécessaire. Par exemple :
HTML::Entities nécessite la version >= 1.32 pour fonctionner correctement, même si le journal des modifications
est silencieux à ce sujet.

Organisateur Ce que à propos binaire données, comme images?
Eh bien, à part un simple « binmode $fh », vous ne devriez pas les traiter spécialement. (Le binmode
est nécessaire car sinon Perl peut convertir les fins de ligne sur les systèmes Win32.)

Attention cependant à ne jamais combiner des chaînes de texte avec des chaînes binaires. Si vous avez besoin de texte dans
un flux binaire, encodez d'abord vos chaînes de texte en utilisant l'encodage approprié, puis joignez
avec des chaînes binaires. Voir aussi : « Et si je n'encode pas ? ».

Quand devrait I décoder or encoder?
Chaque fois que vous communiquez du texte avec quelque chose d'extérieur à votre processus Perl,
comme une base de données, un fichier texte, un socket ou un autre programme. Même si l'objet que vous utilisez
communiquer avec est également écrit en Perl.

Organisateur Ce que if I ne le font pas décoder?
Chaque fois que votre chaîne binaire codée est utilisée avec une chaîne de texte, Perl supposera
que votre chaîne binaire a été codée selon la norme ISO-8859-1, également appelée latin-1. Si ce n'était pas le cas
latin-1, vos données sont alors converties de manière désagréable. Par exemple, si elles étaient en UTF-8,
les octets individuels des caractères multi-octets sont considérés comme des caractères distincts, puis à nouveau
converti en UTF-8. Ce double encodage peut être comparé au double encodage HTML.
(">"), ou double codage URI (%253E).

Ce décodage implicite et silencieux est appelé « mise à niveau ». Cela peut paraître positif, mais c'est
il vaut mieux l'éviter.

Organisateur Ce que if I ne le font pas encoder?
Votre chaîne de texte sera envoyée en utilisant les octets du format interne de Perl. Dans certains cas,
Perl vous avertira que vous faites quelque chose de mal, avec un avertissement amical :

Caractère large imprimé à la ligne 2 de example.pl.

Étant donné que le format interne est souvent UTF-8, ces bugs sont difficiles à repérer, car UTF-8 est
C'est généralement l'encodage souhaité ! Mais ne soyez pas paresseux et n'utilisez pas le fait que Perl
Le format interne est UTF-8, ce qui est avantageux. Encodez explicitement pour éviter les bugs étranges et
montrez aux programmeurs de maintenance que vous avez bien réfléchi à cela.

Is a manière à automatiquement décoder or encoder?
Si toutes les données provenant d'un certain handle sont codées exactement de la même manière, vous pouvez
Indiquez au système PerlIO de tout décoder automatiquement, grâce à la couche « encodage ». Si
vous faites cela, vous ne pouvez plus oublier accidentellement de décoder ou d'encoder, sur des choses qui utilisent
la poignée en couches.

Vous pouvez fournir cette couche lors de « l'ouverture » du fichier :

ouvre mon $fh, '>:encoding(UTF-8)', $filename; # encodage automatique à l'écriture
ouvre mon $fh, '<:encoding(UTF-8)', $filename; # décodage automatique à la lecture

Ou si vous avez déjà un handle de fichier ouvert :

binmode $fh, ':encoding(UTF-8)';

Certains pilotes de base de données pour DBI peuvent également encoder et décoder automatiquement, mais c'est
parfois limité à l'encodage UTF-8.

Organisateur Ce que if I ne le font pas savoir qui codage a été élaboré utilisé?
Faites tout ce que vous pouvez pour le découvrir, et si vous devez le faire : devinez. (N'oubliez pas de documenter votre
(devinez avec un commentaire.)

Vous pouvez ouvrir le document dans un navigateur Web et modifier le jeu de caractères ou le caractère
encodage jusqu'à ce que vous puissiez confirmer visuellement que tous les caractères ressemblent à ce qu'ils devraient être.

Il n’existe aucun moyen fiable de détecter automatiquement l’encodage, donc si les gens continuent à envoyer
vos données sans indication de jeu de caractères, vous devrez peut-être les éduquer.

Pouvez I utilisé Unicode in my Perl sources?
Oui, c'est possible ! Si vos sources sont encodées en UTF-8, vous pouvez l'indiquer avec l'option « Utiliser UTF-8 ».
pragmatique.

utiliser utf8 ;

Cela n'affecte en rien vos entrées ou vos sorties. Cela influence uniquement la façon dont vos
Les sources sont lues. Vous pouvez utiliser Unicode dans les littéraux de chaîne, dans les identifiants (mais ils restent
doivent être des « caractères de mot » selon « \w »), et même dans des délimiteurs personnalisés.

Données::Dumper ne pas restaurer le UTF8 drapeau; is it cassé?
Non, les capacités Unicode de Data::Dumper sont conformes à leurs attentes. Il y a eu quelques
plaintes selon lesquelles il devrait restaurer le drapeau UTF8 lorsque les données sont lues à nouveau avec « eval ».
Cependant, vous ne devriez vraiment pas regarder le drapeau, et rien n'indique que Data::Dumper
devrait enfreindre cette règle.

Voici ce qui se passe : lorsque Perl lit une chaîne littérale, il s'en tient à l'encodage 8 bits comme
aussi longtemps que possible. (Mais peut-être qu'à l'origine, il était codé en interne en UTF-8, lorsque vous
(je l'ai abandonné.) Lorsqu'il doit abandonner cela parce que d'autres caractères sont ajoutés au texte
chaîne, il met à niveau silencieusement la chaîne vers UTF-8.

Si vous encodez correctement vos chaînes pour la sortie, rien de tout cela ne vous concerne et vous
peut simplement « évaluer » les données vidées comme toujours.

Pourquoi Choisir do regex caractère les classes parfois rencontre uniquement in le ASCII intervalle?
À partir de Perl 5.14 (et partiellement de Perl 5.12), il suffit de mettre une fonctionnalité « utiliser »
« unicode_strings » au début de votre programme. Dans sa portée lexicale,
Ce problème ne devrait pas se produire. Il est également activé automatiquement sous « Utiliser la fonctionnalité :5.12 ».
ou « utiliser v5.12 » ou utiliser « -E » sur la ligne de commande pour Perl 5.12 ou supérieur.

La raison pour laquelle cela est exigé est de ne pas casser les anciens programmes qui dépendent de la façon dont
Tout fonctionnait avant l'arrivée d'Unicode. Ces anciens programmes ne connaissaient que l'ASCII.
jeu de caractères, et peut donc ne pas fonctionner correctement avec des caractères supplémentaires. Lorsqu'une chaîne est
codé en UTF-8, Perl suppose que le programme est préparé à traiter Unicode, mais lorsque
la chaîne ne l'est pas, Perl suppose que seul l'ASCII est souhaité, et donc les caractères qui sont
les caractères non ASCII ne sont pas reconnus comme ils le seraient en Unicode. « utiliser la fonctionnalité
« unicode_strings » indique à Perl de traiter tous les caractères comme Unicode, que la chaîne soit
encodé en UTF-8 ou non, évitant ainsi le problème.

Cependant, sur les versions antérieures de Perl, ou si vous passez des chaînes à des sous-routines en dehors de la fonctionnalité
portée, vous pouvez forcer les règles Unicode en changeant l'encodage en UTF-8 en faisant
« utf8::upgrade($string) ». Cette méthode peut être utilisée en toute sécurité sur n'importe quelle chaîne, car elle vérifie et ne vérifie pas.
modifier les chaînes qui ont déjà été mises à niveau.

Pour une discussion plus détaillée, voir Unicode::Semantics sur CPAN.

Pourquoi Choisir do quelques caractères pas majuscule or minuscule correctement?
Voir la réponse à la question précédente.

Comment la Vous pouvez I déterminer if a string is a texte string or a binaire chaîne?
C'est impossible. Certains utilisent l'option UTF8 pour cela, mais c'est une mauvaise utilisation et cela rend les choses bien faites.
Les modules comme Data::Dumper ont une mauvaise apparence. L'indicateur est inutile à cet effet, car il est désactivé.
lorsqu'un codage 8 bits (par défaut ISO-8859-1) est utilisé pour stocker la chaîne.

C'est quelque chose que vous, le programmeur, devez suivre ; désolé. Vous pourriez envisager
en adoptant une sorte de « notation hongroise » pour aider à cela.

Comment la do I convertir à partir de codage FOO à codage BAR?
En convertissant d'abord la chaîne d'octets codée FOO en une chaîne de texte, puis la chaîne de texte
vers une chaîne d'octets codée en BAR :

mon $text_string = decode('FOO', $foo_string);
mon $bar_string = encode('BAR', $text_string);

ou en sautant la partie chaîne de texte et en passant directement d'un codage binaire à l'autre
autre:

utiliser Encode qw(de_à);
from_to($string, 'FOO', 'BAR'); # modifie le contenu de $string

ou en laissant le décodage et l'encodage automatiques faire tout le travail :

ouvre mon $foofh, '<:encoding(FOO)', 'example.foo.txt';
ouvre mon $barfh, '>:encoding(BAR)', 'example.bar.txt';
imprimer { $barfh } $_ tandis que <$foofh>;

Organisateur Ce que sommes-nous "decode_utf8" et "encode_utf8"?
Ce sont des syntaxes alternatives pour « decode('utf8', ...) » et « encode('utf8', ...) ».

Organisateur Ce que is a "large personnage"?
Il s’agit d’un terme utilisé pour les caractères occupant plus d’un octet.

L'avertissement Perl « Caractère large dans… » est provoqué par un tel caractère. Sans spécification
Au niveau de la couche d'encodage, Perl tente de faire tenir les données dans un seul octet. S'il n'y parvient pas, il émet ceci :
avertissement (si les avertissements sont activés) et utilise à la place des données codées en UTF-8.

Pour éviter cet avertissement et éviter d'avoir des encodages de sortie différents dans un même flux,
spécifiez toujours un encodage explicitement, par exemple avec une couche PerlIO :

binmode STDOUT, ":encodage(UTF-8)";

INTERNES


Organisateur Ce que is "la UTF8 drapeau"?
S'il vous plaît, à moins que vous ne piratiez les composants internes ou que vous ne débogiez des bizarreries, ne pensez pas à la
L'option UTF8 n'est pas du tout utilisée. Cela signifie que vous ne devriez probablement pas utiliser « is_utf8 », « _utf8_on » ou
"_utf8_off" du tout.

L'indicateur UTF8, également appelé SvUTF8, est un indicateur interne qui indique que le
La représentation interne est UTF-8. Sans l'indicateur, on suppose qu'elle est ISO-8859-1. Perl
convertit automatiquement entre ces deux valeurs. (En fait, Perl suppose généralement que la représentation
est ASCII ; voir « Pourquoi les classes de caractères regex correspondent-elles parfois uniquement dans la plage ASCII ? »
au dessus de.)

L'un des formats internes de Perl est UTF-8. Malheureusement, Perl ne peut pas conserver
secret, donc tout le monde le sait. C'est une source de confusion. Il vaut mieux
prétendre que le format interne est un codage inconnu, et que vous devez toujours
encoder et décoder explicitement.

Organisateur Ce que à propos le "utilisation octets" pragmatique?
Ne l'utilisez pas. Cela n'a aucun sens de gérer des octets dans une chaîne de texte, et cela n'a aucun sens.
pour gérer les caractères d'une chaîne d'octets. Effectuez les conversions appropriées (en
décodage/encodage), et les choses fonctionneront bien : vous obtenez le nombre de caractères pour les données décodées
données et nombre d'octets pour les données codées.

« Utiliser des octets » est généralement une tentative infructueuse d'accomplir une tâche utile. Oubliez-la.

Organisateur Ce que à propos le "utilisation codage" pragmatique?
Ne l'utilisez pas. Malheureusement, il suppose que l'environnement du programmeur et celui de l'utilisateur sont identiques.
L'utilisateur utilisera le même encodage. Il utilisera le même encodage pour le code source et pour
STDIN et STDOUT. Lorsqu'un programme est copié sur une autre machine, le code source n'est pas
changer, mais l'environnement STDIO pourrait le faire.

Si vous avez besoin de caractères non ASCII dans votre code source, créez-en un fichier codé en UTF-8 et
"utiliser utf8".

Si vous devez définir l'encodage pour STDIN, STDOUT et STDERR, par exemple en fonction de
paramètres régionaux de l'utilisateur, « utiliser ouvert ».

Organisateur Ce que is le différence jusqu'à XNUMX fois ":codage" et ":utf8"?
Étant donné que UTF-8 est l'un des formats internes de Perl, vous pouvez souvent simplement ignorer l'encodage ou
étape de décodage et manipuler directement le drapeau UTF8.

Au lieu de ":encoding(UTF-8)", vous pouvez simplement utiliser ":utf8", ce qui ignore l'étape d'encodage
si les données étaient déjà représentées en UTF8 en interne. Ceci est largement reconnu comme une bonne pratique.
comportement lorsque vous écrivez, mais cela peut être dangereux lorsque vous lisez, car cela provoque
incohérence interne lorsque vous avez des séquences d'octets invalides. L'utilisation de « :utf8 » en entrée peut
Cela peut parfois entraîner des failles de sécurité, veuillez donc utiliser ":encoding(UTF-8)" à la place.

Au lieu de « decode » et « encode », vous pourriez utiliser « _utf8_on » et « _utf8_off », mais c'est
considéré comme un mauvais style. « _utf8_on » peut s'avérer dangereux, pour la même raison que
":utf8" peut.

Il existe quelques raccourcis pour les oneliners ; voir -C dans perlrun.

Ce qui est le différence jusqu'à XNUMX fois "UTF-8" et "utf8"?
« UTF-8 » est la norme officielle. « UTF-8 » est la façon dont Perl est libéral dans ce qu'il
accepte. Si vous devez communiquer avec des personnes moins libérales, vous pourriez vouloir
Pensez à utiliser « UTF-8 ». Si vous devez communiquer avec des termes trop généraux,
Il faudra peut-être utiliser « utf8 ». L'explication complète se trouve dans Encode.

« UTF-8 » est connu en interne sous le nom d'« utf-8-strict ». Le tutoriel utilise UTF-8 de manière cohérente, même
où utf8 est en fait utilisé en interne, car la distinction peut être difficile à faire, et
est en grande partie hors de propos.

Par exemple, utf8 peut être utilisé pour les points de code qui n'existent pas dans Unicode, comme 9999999,
mais si vous l'encodez en UTF-8, vous obtenez un caractère de substitution (par défaut ; voir
« Gestion des données malformées » dans Encode pour plus de moyens de gérer ce problème.)

D'accord, si vous insistez : le « format interne » est utf8, pas UTF-8. (Quand ce n'est pas un autre
codage.)

I perdu Piste; est ce que nous faisons codage is le interne le format vraiment?
C'est bien que vous ayez perdu le fil, car vous ne devriez pas dépendre du format interne
aucun codage spécifique. Mais puisque vous le demandez : par défaut, le format interne est soit
ISO-8859-1 (latin-1) ou UTF-8, selon l'historique de la chaîne. Sur EBCDIC
plateformes, cela peut même être différent.

Perl sait comment il a stocké la chaîne en interne et utilisera cette connaissance lorsque vous
« Encoder ». Autrement dit : ne cherchez pas à déterminer l'encodage interne d'un élément donné.
la chaîne est, mais plutôt encodez-la simplement dans l'encodage que vous souhaitez.

Utilisez perlunifaq en ligne avec les services onworks.net


Serveurs et postes de travail gratuits

Télécharger des applications Windows et Linux

Commandes Linux

Ad




×
Publicité
❤ ️Achetez, réservez ou achetez ici — gratuitement, contribue à maintenir la gratuité des services.