2016-04-27 13 views
1

Ich habe ein Problem hier, wo ich Perl verwende, um einige Zeichen über ein Eingabetextfeld einzugeben und in der Datenbank zu speichern. Alle Werte durchlaufen eine Funktion, um escapeHTML vor dem Speichern in der Datenbank auszuführen. Problem ist, dass diese escapeHTML-Funktion einige meiner chinesischen Zeichen in HTML-Code umwandelt, der in Beispiel 2 und 3 gezeigt wird. Ich frage mich nur, warum escapeHTML nur Auswirkungen auf einige Unicode-Zeichen und nicht alle hat ??htmlscape konvertiert einige Unicode-Zeichen

Hoffe jemand kann mir dabei helfen.

Dank

use CGI qw(escapeHTML); 

$string = "泰国"; 
$string = escapeHTML($string); 

$string2 = "مرحبا بالعالم"; 
$string2 = escapeHTML($string2); 

example 1: 
$VAR1 = 'Dump out string مرحبا بالعالم'; 
$VAR1 = 'Dump out after escapeHTML string مرحبا بالعالم'; 

Example 2: 
$VAR1 = 'Dump out string 泰国'; 
$VAR1 = 'Dump out after escapeHTML string 泰▒›▒'; 

Example 3: 
$VAR1 = 'Dump out string 泰国 - <font>TEST</font>'; 
$VAR1 = 'Dump out after escapeHTML string 泰▒&#8250;▒ - &lt;font&gt;TEST&lt;/font&gt;'; 
+0

Woher kommt escapeHTML? Verwenden Sie ein Modul, wahrscheinlich mit 'use Some :: Module;' an der Spitze Ihres Skripts? Die zweite Zeile hat einen Syntaxfehler: ** $ ** escapeHTML ($ string) ist nicht gültig, wahrscheinlich sollte $ entfernt werden. – Sebastian

+1

Entschuldigung, ich habe bereits meine Frage verbessert und ja es von CGI verwenden qw (escapeHTML); Ich bin etwas neu in Perl und benutze die Syntax. Entschuldigung –

+1

Wenn Sie Unicode-Zeichenfolgen in Ihrer Quelle verwenden möchten, müssen Sie 'utf8;' verwenden. Wenn alle Ihre Inputs/Outputs in utf8 sind, sollten Sie wahrscheinlich auch "utf8 :: all" benutzen, was alle Ihre Datei-Handles in utf8 öffnet. Andernfalls können einige utf8-Strings aus Legacy-Gründen als latin1 ausgegeben werden. – mirod

Antwort

1

Die bevorzugte Art von HTML-Codierung ist HTML::Entities

Encode nur unsichere Zeichen Default:

$encoded = encode_entities($string); 

Encode < und>, aber keine & und andere:

$encoded = encode_entities($string,'<>'); 

Encode non-plain ASCII:

$encoded = encode_entities($input, '^\n\x20-\x25\x27-\x7e'); 

escapeHTML() ist nicht Bestandteil des CGI documentation, nehme ich an, dass es nicht für den Aufbau ist von außerhalb des CGI-Moduls verwendet wird. Es wird mit Hilfe von HTML :: selbst Entities, wenn Sie an der CGI-Quelle aussehen:

$ENCODE_ENTITIES  = q{&<>"'}; 
sub escapeHTML { 
    require HTML::Entities; 
    # hack to work around earlier hacks 
    push @_,$_[0] if @_==1 && $_[0] eq 'CGI'; 
    my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_); 
    return undef unless defined($toencode); 
    my $encode_entities = $ENCODE_ENTITIES; 
    $encode_entities .= "\012\015" if ($encode_entities && $newlinestoo); 
    return HTML::Entities::encode_entities($toencode,$encode_entities); 
} 

diesen Sourcecode sehen, frage ich mich, warum es tut jede Unicode-Codierung überhaupt.

+1

Hallo Danke für die Antwort und ich denke, ich weiß, was das Problem hier ist. Ich habe tatsächlich auf diese Seite verwiesen http://perldoc.perl.org/CGI.html und es gibt einen Abschnitt über escapeHTML, der besagt "Zusätzlich die hexadezimalen 0x8b und 0x9b Zeichen, die einige Browser fälschlicherweise als den linken und rechten Winkel interpretieren - Bracket-Zeichen werden durch ihre numerischen Zeichenentitäten ersetzt ("& # 8249" und "›") ". Ich denke, deshalb waren nur einige Charaktere davon betroffen. –