htmlescape转换某些unicode字符

htmlescape转换某些unicode字符,html,perl,unicode,escaping,Html,Perl,Unicode,Escaping,这里有一个问题,我使用perl通过输入文本框输入一些字符并保存到数据库中。在保存到数据库之前,所有值都将通过一个函数运行escapeHTML。问题是这个escapeHTML函数也在将我的一些汉字转换为HTML代码,如示例2和3所示。我只是想知道为什么escapeHTML只影响一些unicode字符而不是所有字符 希望有人能帮我 谢谢 use CGI qw(escapeHTML); $string = "泰国"; $string = escapeHTML($string); $string2

这里有一个问题,我使用perl通过输入文本框输入一些字符并保存到数据库中。在保存到数据库之前,所有值都将通过一个函数运行escapeHTML。问题是这个escapeHTML函数也在将我的一些汉字转换为HTML代码,如示例2和3所示。我只是想知道为什么escapeHTML只影响一些unicode字符而不是所有字符

希望有人能帮我

谢谢

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;';
使用cgiqw(escapeHTML);
$string=”泰国";
$string=escapeHTML($string);
$string2=“محب㶕㶕㶋㶋㶋”;
$string2=escapeHTML($string2);
例1:
$VAR1=‘转储字符串’;
$VAR1=‘在转义字符串后转储’;
例2:
$VAR1='转储字符串泰国';
$VAR1='在转义HTML字符串后转储泰▒›▒';
例3:
$VAR1='转储字符串泰国 - 测试';
$VAR1='在转义HTML字符串后转储泰▒›▒ - 字体测试/字体';

HTML编码的首选方式是

仅编码默认的不安全字符:

$encoded = encode_entities($string);
编码<和>,但不编码&和其他:

$encoded = encode_entities($string,'<>');
escapeHTML()
不是的一部分,我假设它不是为从CGI模块外部使用而构建的。如果您查看CGI源代码,它使用的是HTML::Entities本身:

$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);
}
$ENCODE_ENTITIES=q{&“};
子EHTML{
需要HTML::实体;
#hack可以绕过早期的hack
如果@u==1&$[0]eq'CGI',则推送@u,$[0];
my($self,$toencode,$newlinestoo)=CGI::self\u或\u默认值(@);
除非定义,否则返回undef($toencode);
my$encode_entities=$encode_entities;
$encode_entities.=“\012\015”if($encode_entities&&$newlinesto);
返回HTML::Entities::encode_Entities($toencode,$encode_Entities);
}

看到这个源代码,我想知道为什么它会使用Unicode编码。

escapeHTML来自哪里?您是否正在使用模块,可能与
一起使用Some::module在脚本的顶部?第二行有语法错误:*$**escapeHTML($string)无效,可能应该删除$。对不起,我已经回答了我的问题,是的,它来自CGI qw(escapeHTML);我对perl有点陌生,并开始使用语法。因此,如果您想在源代码中使用unicode字符串,则需要
使用utf8。如果您的所有输入/输出都是utf8格式,您可能还应该
使用utf8::all
,它将以utf8格式打开所有文件句柄。否则,由于遗留的原因,一些utf8字符串有可能被输出为拉丁语1。
utf8::all
非常方便,95%是好主意。我更喜欢,因为它使我的代码不受限制。嗨,谢谢你的回答,我想我知道这里有什么问题。实际上,我提到了这一页,其中有一个关于escapeHTML的部分指出“此外,十六进制0x8b和0x9b字符(一些浏览器错误地将其解释为左括号和右括号字符)被其数字字符实体(‹”和“›;”所取代”。所以我想这就是为什么只有一些角色受到影响。
$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);
}