Question

Je ne suis pas trop bon quand il s'agit de codage et je veux comprendre comment retourner les données car le même codage qu'il a commencé avec ...

J'ai un fichier avec certains caractères tels que '»' Au moment où j'ai édité et inséré dans la base de données, ils se sont transformés en «».

Decode_entities () ne fait rien et Encode_entités code à nouveau les caractères. J'ai donc créé mon propre sous pour résoudre ce problème, mais cela convient que lors de l'obtention des données du fichier, il ne récupéra pas dans le bon format.

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

n'y a-t-il pas d'option d'encodage comme;

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

Et mon sous est;

sub unicodeConvert($) {
   my $str = shift;
    my %entityRef = ("&" => "&amp;", '¢' => "&cent;", '¤' => "&curren;", '¦' => "&brvbar;", '¨' => "&uml;", 'ª' => "&ordf;", '¬' => "&not;", '®' => "&reg;", '°' => "&deg;", '²' => "&sup2;", '´' => "&acute;", '¶' => "&para;", '¸' => "&cedil;", 'º' => "&ordm;", '¼' => "&frac14;", '¾' => "&frac34;", 'À' => "&Agrave;", 'Â' => "&Acirc;", 'Ä' => "&Auml;", 'Æ' => "&AElig;", 'È' => "&Egrave;", 'Ê' => "&Ecirc;", 'Ì' => "&Igrave;", 'Î' => "&Icirc;", 'Ð' => "&ETH;", 'Ò' => "&Ograve;", 'Ô' => "&Ocirc;", 'Ö' => "&Ouml;", 'Ø' => "&Oslash;", 'Ú' => "&Uacute;", 'Ü' => "&Uuml;", 'Þ' => "&THORN;", 'à' => "&agrave;", 'â' => "&acirc;", 'ä' => "&auml;", 'æ' => "&aelig;", 'è' => "&egrave;", 'ê' => "&ecirc;", 'ì' => "&igrave;", 'î' => "&icirc;", 'ð' => "&eth;", 'ò' => "&ograve;", 'ô' => "&ocirc;", 'ö' => "&ouml;", 'ø' => "&oslash;", 'ú' => "&uacute;", 'ü' => "&uuml;", 'þ' => "&thorn;", '¡' => "&iexcl;", '£' => "&pound;", '¥' => "&yen;", '§' => "&sect;", '©' => "&copy;", '«' => "&laquo;", '¯' => "&macr;", '±' => "&plusmn;", '³' => "&sup3;", 'µ' => "&micro;", '·' => "&middot;", '¹' => "&sup1;", '»' => "&raquo;", '½' => "&frac12;", '¿' => "&iquest;", 'Á' => "&Aacute;", 'Ã' => "&Atilde;", 'Å' => "&Aring;", 'Ç' => "&Ccedil;", 'É' => "&Eacute;", 'Ë' => "&Euml;", 'Í' => "&Iacute;", 'Ï' => "&Iuml;", 'Ñ' => "&Ntilde;", 'Ó' => "&Oacute;", 'Õ' => "&Otilde;", '×' => "&times;", 'Ù' => "&Ugrave;", 'Û' => "&Ucirc;", 'Ý' => "&Yacute;", 'ß' => "&szlig;", 'á' => "&aacute;", 'ã' => "&atilde;", 'å' => "&aring;", 'ç' => "&ccedil;", 'é' => "&eacute;", 'ë' => "&euml;", 'í' => "&iacute;", 'ï' => "&iuml;", 'ñ' => "&ntilde;", 'ó' => "&oacute;", 'õ' => "&otilde;", '÷' => "&divide;", 'ù' => "&ugrave;", 'û' => "&ucirc;", 'ý' => "&yacute;", 'ÿ' => "&yuml;");
    while( ( my $key, my $obj ) = each( %entityRef ) ) {
        if( $key ne '&' ) {
                $str =~ s/$key/$obj/gis
        } else {
                $str =~ s#&((?!(quot;)|(amp;)|(cent;)|(curren;)|(brvbar;)|(uml;)|(ordf;)|(not;)|(reg;)|(deg;)|(sup2;)|(acute;)|(para;)|(cedil;)|(ordm;)|(frac14;)|(frac34;)|(Agrave;)|(Acirc;)|(Auml;)|(AElig;)|(Egrave;)|(Ecirc;)|(Igrave;)|(Icirc;)|(ETH;)|(Ograve;)|(Ocirc;)|(Ouml;)|(Oslash;)|(Uacute;)|(Uuml;)|(THORN;)|(agrave;)|(acirc;)|(auml;)|(aelig;)|(egrave;)|(ecirc;)|(igrave;)|(icirc;)|(eth;)|(ograve;)|(ocirc;)|(ouml;)|(oslash;)|(uacute;)|(uuml;)|(thorn;)|(iexcl;)|(pound;)|(yen;)|(sect;)|(copy;)|(laquo;)|(macr;)|(plusmn;)|(sup3;)|(micro;)|(middot;)|(sup1;)|(raquo;)|(frac12;)|(iquest;)|(Aacute;)|(Atilde;)|(Aring;)|(Ccedil;)|(Eacute;)|(Euml;)|(Iacute;)|(Iuml;)|(Ntilde;)|(Oacute;)|(Otilde;)|(times;)|(Ugrave;)|(Ucirc;)|(Yacute;)|(szlig;)|(aacute;)|(atilde;)|(aring;)|(ccedil;)|(eacute;)|(euml;)|(iacute;)|(iuml;)|(ntilde;)|(oacute;)|(otilde;)|(divide;)|(ugrave;)|(ucirc;)|(yacute;)|(yuml;)|(nbsp;)))#$obj#gis;   
        }
    }
    return $str;
}
Était-ce utile?

La solution

Comme indiqué dans le commentaire sur votre question, je ne sais pas ce que vous demandez exactement.

Je suppose donc que vous essayez de convertir les caractères Unicode en entités HTML. Dans ce cas, l'utilisation de l'un des modules pré-fabriqués devrait être meilleur. Si cela ne fonctionne pas en raison de problèmes d'encodage (qui sont assez difficiles à Perl), alors la réponse à votre question:

N'y a-t-il pas d'option d'encodage comme

open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";

... le résoudra probablement, et cela ferait probablement fonctionner votre propre tentative, mais mieux vaut en utiliser un prêt à l'emploi ;-) (Au fait, la façon dont vous l'avez écrit était comme un "UTF-8 "Option de die Ce qui a rendu un peu difficile à comprendre ce que vous demandiez ;-)

Oui, il y a une option UTF-8, en supposant que vous avez un perl (> = v5.8):

open(my $fh,'<:encoding(UTF-8)', $file) or die "Error opening $file: $!";

(Exemple adapté de perluniintro)

Vous pouvez aussi utiliser binmode Pour modifier un fichier déjà ouvert (par exemple stdin / out).

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

Vous pouvez également définir le codage par défaut avec le ouvert pragma.

Mais pour ça, je suggère d'essayer binmode Ou modifier votre ligne ouverte pour voir si cela le résout.

Si tu as un perl Moins de V5.8, les choses sont plus difficiles, mais peut-être résolues si vous nous dites la version.

Quelques autres choses que j'ai remarquées d'ailleurs:

  • Pas essentiel, mais il est considéré comme mieux d'utiliser un fichier à portée lexicalement (my $fh à la place de FILE).
  • Lorsque vous mettez une nouvelle ligne sur le die String, il supprime les informations de numéro de ligne qui sont normalement ajoutées pour vous aider à trouver le problème.
  • Si vous mettez le nom du fichier qui ne pourrait pas être ouvert (ou le SQL qui a échoué, ou autre) dans le message Die, il sera plus facile de déboguer.
  • N'utilisez pas de sous-prototypes dans Perl (5) : (sub unicodeConvert($)). Ne mettez pas le $/@/% etc. là-dedans. Il ne vérifie pas les choses, cela peut changer le sens de manière déroutante. Il est nécessaire de créer de nouveaux opérateurs de «style intégré».

Autres conseils

Je soupçonne que vous une différence dans les caractères de votre terminal (qui peut être UTF-8) et le code source de votre script Perl (que vous éditez peut-être dans un éditeur de Charset-Aware en 8859-1). Si vous êtes sûr, que votre terminal et votre code source sont dans le même charme, essayez de mettre use utf8; à votre en-tête de script (voir perlunicode de l'homme). Si cela ne vous aide pas, essayez d'imprimer les données, qui est stockée dans votre base de données (augmenter la journalisation de débogage pour DBI) (peut-être irritaire, car vous ne stockez pas les données comme UTF8). Généralement, essayez de fournir:

  1. La peinture de votre terminal (locale) Si vous exécutez votre script pour un terminal (ou un paramètre régional, qui est utilisé par votre serveur, si vous le lancez à partir de par exemple apache)
  2. Le chargé de votre code source.
  3. Codepage de connexion MySQL (émettez-vous SET NAMES 'utf8'?)

Également pour l'encodage HTML, vous pouvez trouver plus facile à réutiliser HTML::Entities::decode() / HTML::Entities::encode() plutôt que de l'implémenter par vous-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top