Domanda

Non sono troppo bravo quando si tratta di codifica e voglio capire come restituire i dati come la stessa codifica iniziata con ...

Ho un file con alcuni caratteri '»' Quando ho modificato e inserito nel database si sono trasformati in â ».

decode_enties () non fa nulla e encode_enties codifica di nuovo i caratteri. Così ho creato il mio sottomarino per risolverlo, ma a capita che quando si ottiene i dati dal file non si sta recuperando nel formato giusto.

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

Non esiste un'opzione di codifica come;

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 il mio 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;
}
È stato utile?

Soluzione

Come notato nel commento sulla tua domanda, non sono sicuro di cosa stai chiedendo esattamente.

Quindi suppongo che tu stia cercando di convertire i caratteri Unicode in entità HTML. In tal caso, l'uso di uno dei moduli pre-fatti dovrebbe essere migliore. Se ciò non funziona a causa di problemi di codifica (che sono piuttosto difficili in Perl), allora la risposta alla tua domanda:

Non esiste un'opzione di codifica come

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

... Probabilmente lo risolverà, e probabilmente farà funzionare anche il tuo tentativo, ma meglio usarne uno pronto ;-) (A proposito, il modo in cui l'hai scritto c'era come "UTF-8 "Opzione a die Il che ha reso un po 'difficile capire cosa stavi chiedendo ;-)

Sì, esiste un'opzione UTF-8, supponendo che tu abbia un recente perl (> = v5.8):

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

(Esempio adattato da Perluniintro)

Puoi anche usare binmode Per modificare un fileHandle già aperto (ad esempio stdin/out).

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

È inoltre possibile impostare la codifica predefinita con il aprire Pragma.

Ma per questo suggerisco di provarci binmode o cambiare la linea aperta per vedere se questo risolve.

Se hai un perl Meno di V5.8, le cose sono più complicate, ma forse risolvibili se ci dici la versione.

Un paio di altre cose che ho notato a proposito:

  • Non essenziale, ma è considerato meglio utilizzare un filehandle con ambito lessico (my $fh invece di FILE).
  • Quando metti una nuova linea sul die String, sopprime le informazioni sul numero di riga che vengono normalmente aggiunte per aiutarti a trovare il problema.
  • Se si inserisce il nome del file che non è stato possibile aprire (o il SQL che non è riuscito, o qualsiasi altra cosa) nel messaggio DE sarà più facile debug.
  • Non utilizzare prototipi secondari in Perl (5) : (sub unicodeConvert($)). Non mettere il $/@/% ecc. dentro. Non controlla solo le cose, può cambiare il significato in modi confusi. È necessario solo creare nuovi operatori di "stile integrato".

Altri suggerimenti

Sospetto che tu sia una differenza nei caratteri del tuo terminale (che può essere UTF-8) e il codice sorgente del tuo script Perl (che forse si modifica in un editor di chatset-aware in 8859-1). Se sei sicuro, che il tuo terminale e il tuo codice sorgente sono nello stesso chatset, prova a mettere use utf8; alla tua intestazione di script (vedi uomo perlunicode). Se ciò non aiuta, prova a stampare i dati, che vengono archiviati nel tuo database (aumenta la registrazione del debug per DBI) (forse irrilevante, poiché non si archivia i dati come UTF8). Generalmente, cerca di fornire:

  1. Il codepage del tuo terminale (locale) se esegui il tuo script per un terminale (o una locale di sistema, che viene utilizzato dal server, se lo si avvia da EG Apache)
  2. Il chatset del codice sorgente.
  3. MySQL Connection CodePage (emetti SET NAMES 'utf8'?)

Anche per la codifica HTML potresti trovare più facile da riutilizzare HTML::Entities::decode() / HTML::Entities::encode() piuttosto che implementarlo da solo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top