Pregunta

No soy muy bueno cuando se trata de codificar y quiero descubrir cómo devolver los datos como la misma codificación que comenzó con ...

Tengo un archivo con algunos caracteres en como '»' Para el momento en que he editado e insertado en la base de datos, se han convertido en ».

Decode_entities () no hace nada y code_entities codifica los chars nuevamente. Así que creé mi propio submarino para solucionarlo, pero se basa en que al obtener los datos del archivo no se recupera en el formato correcto.

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>);
    ...
    .. 

¿No hay una opción de codificación como;

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>);
    ...
    .. 

y mi sub es;

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;
}
¿Fue útil?

Solución

Como se señaló en el comentario sobre su pregunta, no estoy seguro de qué está haciendo exactamente.

Así que supongo que estás tratando de convertir personajes unicode en entidades HTML. En cuyo caso, el uso de uno de los módulos prefabricados debería ser mejor. Si eso no funciona debido a problemas de codificación (que son bastante complicados en Perl), entonces la respuesta a su pregunta:

¿No hay una opción de codificación como

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

... probablemente lo resolverá, y probablemente también haría que su propio intento funcione, pero es mejor usar uno listo ;-) (por cierto, la forma en que lo escribió fue como un "UTF-8 "Opción a die Lo que hizo que fuera un poco difícil entender lo que estaba pidiendo ;-)

Sí, hay una opción UTF-8, suponiendo que tenga una reciente perl (> = v5.8):

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

(ejemplo adaptado de perluniintro)

También puedes usar binmode Para cambiar un FileHandle ya abierto (por ejemplo, stdin/out).

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

También puede establecer la codificación predeterminada con el abierto Pragma.

Pero por esto sugiero intentar binmode o cambiar su línea de abierto para ver si eso lo resuelve.

Si tienes un perl Menos de v5.8, las cosas son más complicadas, pero tal vez resueltos si nos dice la versión.

Un par de otras cosas que noté por cierto:

  • No es esencial, pero se considera mejor usar un archivo de archivos de alcance léxico (my $fh en vez de FILE).
  • Cuando pones una nueva línea en el die Cadena, suprime la información del número de línea que normalmente se agrega para ayudarlo a encontrar el problema.
  • Si coloca el nombre del archivo que no se puede abrir (o el SQL que falló, o lo que sea) en el mensaje de la matriz, será más fácil depurar.
  • No use subtrotipos en Perl (5) : (sub unicodeConvert($)). No pongas el $/@/% etc. allí. No solo verifica las cosas, puede cambiar el significado de maneras confusas. Solo es necesario crear nuevos operadores de "estilo incorporado".

Otros consejos

Sospecho que usted es una diferencia en Charsets de su terminal (que puede ser UTF-8) y el código fuente de su script Perl (que tal vez edite en algún editor de Charset-ADAWAR en 8859-1). Si está seguro, que su terminal y su código fuente están en el mismo charset, intente poner use utf8; a tu encabezado de guión (ver hombre perlunicode). Si eso no ayuda, intente imprimir los datos, que se almacenan en su base de datos (aumente el registro de depuración para DBI) (tal vez irrelevante, ya que no almacena datos como UTF8). En general, intente proporcionar:

  1. La expresión de códigos de su terminal (locale) Si ejecuta su script para un terminal (o localidad del sistema, que utiliza su servidor, si lo inicia desde por ejemplo, Apache)
  2. El charset de su código fuente.
  3. MySQL Connection CodePage (¿emite SET NAMES 'utf8'?)

También para la codificación HTML, es posible que sea más fácil de reutilizar HTML::Entities::decode() / HTML::Entities::encode() en lugar de implementar esto por su cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top