Frage

Ich bin nicht so gut, wenn es um Kodierung geht, und ich möchte herausfinden, wie ich Daten mit der gleichen Kodierung zurückgeben kann, mit der sie begonnen haben ...

Ich habe eine Datei mit einigen Zeichen in z '»' Bis ich sie bearbeitet und in die Datenbank eingefügt habe, haben sie sich in Â&raquo verwandelt.

decode_entities() macht nichts und encode_entities kodiert die Zeichen erneut.Also habe ich mein eigenes Sub erstellt, um das zu beheben, aber beim Abrufen der Daten aus der Datei scheint es, dass sie nicht im richtigen Format abgerufen werden.

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

Gibt es keine Codierungsoption wie;

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

und mein Sub ist;

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;
}
War es hilfreich?

Lösung

Wie in dem Kommentar zu Ihrer Frage erwähnt, bin ich mir nicht sicher, was Sie genau fragen.

Ich gehe also davon aus, dass Sie versuchen, Unicode -Zeichen in HTML -Entitäten umzuwandeln. In diesem Fall sollte die Verwendung eines der vorgefertigten Module besser sein. Wenn das aufgrund von Codierungsproblemen (die in Perl ziemlich schwierig sind) nicht funktioniert, dann die Antwort auf Ihre Frage:

Gibt es keine Codierungsoption wie

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

... wird es wahrscheinlich lösen, und es würde wahrscheinlich auch Ihren eigenen Versuch funktionieren, aber besser, eine vorgefertigte zu verwenden ;-) (übrigens, so wie Sie es geschrieben haben, gab es als "UTF-8) "Option zu die was es ein wenig schwer machte zu verstehen, was Sie gefragt haben ;-)

Ja, es gibt eine UTF-8-Option, vorausgesetzt, Sie haben eine aktuelle Option perl (> = v5.8):

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

(Beispiel angepasst von Perluniintro)

Sie können auch verwenden binmode So ändern Sie einen bereits geöffneten FileHandle (z. B. stdin/out).

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

Sie können auch die Standardcodierung mit dem festlegen offen Pragma.

Aber dafür schlage ich vor, es zu versuchen binmode Oder ändern Sie Ihre offene Linie, um festzustellen, ob dies löst.

Wenn Sie eine haben perl Weniger als V5.8, die Dinge sind schwieriger, aber vielleicht auflösbar, wenn Sie uns die Version mitteilen.

Ein paar andere Dinge, die ich übrigens bemerkte:

  • Nicht unerlässlich, aber es wird als besser angesehen, einen lexikalisch abgeschotteten DateiHandle (my $fh Anstatt von FILE).
  • Wenn Sie eine neue Zeile auf die die String, es unterdrückt die Zeilennummerinformationen, die normalerweise hinzugefügt werden, um das Problem zu finden.
  • Wenn Sie den Namen der Datei einfügen, die nicht geöffnet werden konnte (oder die SQL, die fehlgeschlagen ist oder was auch immer) in der Die Nachricht, ist es einfacher zu debuggen.
  • Verwenden Sie keine Subprototypen in Perl (5) : (sub unicodeConvert($)). Setzen Sie das nicht $/@/% usw. drin. Es überprüft nicht nur die Dinge, es kann die Bedeutung auf verwirrende Weise ändern. Es wird nur benötigt, um neue "integrierte Stil" -Operatoren zu erstellen.

Andere Tipps

Ich vermute, Sie haben einen Unterschied zwischen den Zeichensätzen Ihres Terminals (die UTF-8 sein können) und dem Quellcode Ihres Perl-Skripts (den Sie möglicherweise in einem zeichensatzfähigen Editor in 8859-1 bearbeiten).Wenn Sie sicher sind, dass sich Ihr Terminal und Ihr Quellcode im selben Zeichensatz befinden, versuchen Sie es mit der Eingabe use utf8; zu Ihrem Skript-Header (siehe Mann Perlunicode).Wenn das nicht hilft, versuchen Sie, die Daten auszudrucken, die in Ihrer Datenbank gespeichert sind (erhöhen Sie die Debug-Protokollierung für DBI) (möglicherweise irrelevant, da Sie Daten nicht als UTF8 speichern).Versuchen Sie im Allgemeinen Folgendes bereitzustellen:

  1. Die Codepage Ihres Terminals (locale), wenn Sie Ihr Skript für ein Terminal ausführen (oder für ein Systemgebietsschema, das von Ihrem Server verwendet wird, wenn Sie es z. B. vonApache)
  2. Der Zeichensatz Ihres Quellcodes.
  3. MySQL-Verbindungscodepage (stellen Sie aus? SET NAMES 'utf8'?)

Auch für die HTML-Codierung ist die Wiederverwendung möglicherweise einfacher HTML::Entities::decode() / HTML::Entities::encode() anstatt dies selbst umzusetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top