使用 Mojo::DOM 时 NBSP 格式错误
NBSP malformed while using Mojo::DOM
我正在使用 Mojo::DOM Perl 模块替换 <IMG>
标记,但是
实体被 Mojo::DOM 替换为 \xa0,但是当我打印出来时在页面上,NBSP 字符变为 \x{fffd} 并显示为问号。我试过用 替换 \x{00a0}但这样做会破坏另一个 unicode 字符。这是我的代码:
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use CGI;
my $cgi = new CGI;
print $cgi->header(-charset => 'utf-8');
my %params = $cgi->Vars;
print q[<html><head><title>UTF-8 Test</title></head><body><form method="POST"><textarea name="msg" cols="50" rows="20">].$params{msg}.q[</textarea><br/><br/><input type="submit"></form>];
if($ENV{REQUEST_METHOD} eq 'POST') {
require Mojo::DOM;
my $dom = Mojo::DOM->new($params{msg});
for my $e ($dom->find('img')->each) {
my $x = $e->attr('data-char');
if(defined($x) && $x) {
$e->replace($x);
}
else {
$e->delete;
}
}
$params{msg} = $dom->to_string();
print '<hr/><div>'.$params{msg}.'</div>';
}
print q[</body></html>];
发布的 msg 参数内容:
אֱלֹהִים,+אֵת+הַשָּׁמַיִם,+וְאֵת+הָאָרֶץ. 1 In the beginningpo
<img src="p.jpg" data-char=""> Easy Bengali Typing: বাংলা টাইপ
করুন Минюст РФ опубликовал список СМИ-иноагентов Japanese Keyboard -
日本語のキーボード Pre-Qin and Han (先秦兩漢)
这是输出的屏幕截图:
Mojo::DOM 期望使用字符,而不是 UTF-8 编码的字节,因此它很可能将
解码为一个字符,然后需要先将其编码为 UTF-8输出。旧的 CGI 模块不会像现代框架那样解码您的输入参数或编码您的输出。所以你需要自己处理这个:在将 $params{msg}
传递给 Mojo::DOM 之前从 UTF-8 解码它,然后在将它放入输出之前将它编码回 UTF-8(你正在声明一个输出字符集毕竟是 UTF-8)。
if($ENV{REQUEST_METHOD} eq 'POST') {
require Mojo::DOM;
require Mojo::Util;
my $dom = Mojo::DOM->new(Mojo::Util::decode('UTF-8', $params{msg}));
for my $e ($dom->find('img')->each) {
my $x = $e->attr('data-char');
if(defined($x) && $x) {
$e->replace($x);
}
else {
$e->delete;
}
}
$params{msg} = Mojo::Util::encode('UTF-8', $dom->to_string());
print '<hr/><div>'.$params{msg}.'</div>';
}
我正在使用 Mojo::DOM Perl 模块替换 <IMG>
标记,但是
实体被 Mojo::DOM 替换为 \xa0,但是当我打印出来时在页面上,NBSP 字符变为 \x{fffd} 并显示为问号。我试过用 替换 \x{00a0}但这样做会破坏另一个 unicode 字符。这是我的代码:
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use CGI;
my $cgi = new CGI;
print $cgi->header(-charset => 'utf-8');
my %params = $cgi->Vars;
print q[<html><head><title>UTF-8 Test</title></head><body><form method="POST"><textarea name="msg" cols="50" rows="20">].$params{msg}.q[</textarea><br/><br/><input type="submit"></form>];
if($ENV{REQUEST_METHOD} eq 'POST') {
require Mojo::DOM;
my $dom = Mojo::DOM->new($params{msg});
for my $e ($dom->find('img')->each) {
my $x = $e->attr('data-char');
if(defined($x) && $x) {
$e->replace($x);
}
else {
$e->delete;
}
}
$params{msg} = $dom->to_string();
print '<hr/><div>'.$params{msg}.'</div>';
}
print q[</body></html>];
发布的 msg 参数内容:
אֱלֹהִים,+אֵת+הַשָּׁמַיִם,+וְאֵת+הָאָרֶץ. 1 In the beginningpo <img src="p.jpg" data-char=""> Easy Bengali Typing: বাংলা টাইপ করুন Минюст РФ опубликовал список СМИ-иноагентов Japanese Keyboard - 日本語のキーボード Pre-Qin and Han (先秦兩漢)
这是输出的屏幕截图:
Mojo::DOM 期望使用字符,而不是 UTF-8 编码的字节,因此它很可能将
解码为一个字符,然后需要先将其编码为 UTF-8输出。旧的 CGI 模块不会像现代框架那样解码您的输入参数或编码您的输出。所以你需要自己处理这个:在将 $params{msg}
传递给 Mojo::DOM 之前从 UTF-8 解码它,然后在将它放入输出之前将它编码回 UTF-8(你正在声明一个输出字符集毕竟是 UTF-8)。
if($ENV{REQUEST_METHOD} eq 'POST') {
require Mojo::DOM;
require Mojo::Util;
my $dom = Mojo::DOM->new(Mojo::Util::decode('UTF-8', $params{msg}));
for my $e ($dom->find('img')->each) {
my $x = $e->attr('data-char');
if(defined($x) && $x) {
$e->replace($x);
}
else {
$e->delete;
}
}
$params{msg} = Mojo::Util::encode('UTF-8', $dom->to_string());
print '<hr/><div>'.$params{msg}.'</div>';
}