Pergunta

Não sou muito bom quando se trata de codificar e estou querendo descobrir como retornar os dados como a mesma codificação, começou com ...

Eu tenho um arquivo com alguns caracteres em como '»' Quando eu editei e inseri no banco de dados, eles se transformaram em ».

Decode_entities () não faz nada e codificações codifica os chars novamente. Então, criei meu próprio sub para corrigir isso, mas aparece que, ao obter os dados do arquivo, ele não está recuperando no formato certo.

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ão existe uma opção de codificação 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>);
    ...
    .. 

E meu sub é;

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

Solução

Como observado no comentário sobre sua pergunta, não tenho certeza do que exatamente você está perguntando.

Então, estou assumindo que você está tentando converter caracteres Unicode em entidades HTML. Nesse caso, o uso de um dos módulos pré-fabricados deve ser melhor. Se isso não estiver funcionando devido a problemas de codificação (que são bastante complicados no Perl), a resposta à sua pergunta:

Não há uma opção de codificação como

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

... Provavelmente irá resolvê-lo, e provavelmente faria sua própria tentativa funcionar também, mas é melhor usar um pronto ;-) (A propósito, a maneira como você o escreveu era como um "UTF-8 "Opção para die O que tornou um pouco difícil entender o que você estava perguntando ;-)

Sim, existe uma opção UTF-8, supondo que você tenha um recente perl (> = v5.8):

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

(Exemplo adaptado de Perluniintro)

Você também pode usar binmode Para alterar um FileHandle já aberto (por exemplo, stdin/out).

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

Você também pode definir a codificação padrão com o abrir Pragma.

Mas por isso sugiro tentar binmode Ou alterar sua linha aberta para ver se isso a resolve.

Se você tem um perl Menos que V5.8, as coisas são mais complicadas, mas talvez resolvíveis se você nos contar a versão.

Algumas outras coisas que notei pelo caminho:

  • Não é essencial, mas é considerado melhor usar um arquivo de arquivo com escopo lexicamente (my $fh ao invés de FILE).
  • Quando você coloca uma nova linha no die String, ele suprime as informações do número da linha que normalmente são adicionadas para ajudá -lo a encontrar o problema.
  • Se você colocar o nome do arquivo que não pôde ser aberto (ou o SQL que falhou, ou o que for) na mensagem Die, será mais fácil depurar.
  • Não use sub prototipos em Perl (5) : (sub unicodeConvert($)). Não coloque o $/@/% etc. lá. Não apenas verifica as coisas, pode mudar o significado de maneiras confusas. É necessário apenas para criar novos operadores de "estilo interno".

Outras dicas

Suspeito, você é uma diferença nos charsets do seu terminal (que pode ser UTF-8) e o código-fonte do seu script Perl (que talvez você edite em algum editor de Charset-Aware em 8859-1). Se você tem certeza, que seu terminal e seu código -fonte estão no mesmo charset, tente colocar use utf8; para o seu cabeçalho de script (veja homem perlunicode). Se isso não ajudar, tente imprimir os dados, que são armazenados no seu banco de dados (aumente o registro de depuração para o DBI) (talvez irrelevante, pois você não armazena dados como UTF8). Geralmente, tente fornecer:

  1. A página de código do seu terminal (locale) Se você executar seu script para um terminal (ou localidade do sistema, que é usada pelo seu servidor, se você o iniciar do EG Apache)
  2. O charset do seu código -fonte.
  3. MySQL Connection CodePage (você emite SET NAMES 'utf8'?)

Também para codificação HTML, você pode achar mais fácil reutilizar HTML::Entities::decode() / HTML::Entities::encode() em vez de implementar isso por conta própria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top