perl - 使用 Mojo::DOM 时 NBSP 格式错误

标签 perl unicode html-entities mojolicious

我正在使用 Mojo::DOM Perl 模块替换 <IMG>标签,但 &nbsp;实体被 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 &nbsp;<img src="p.jpg" data-char="😎"> Easy Bengali Typing: বাংলা টাইপ করুন Минюст РФ опубликовал список СМИ-иноагентов Japanese Keyboard - 日本語のキーボード Pre-Qin and Han (先秦兩漢)



这是输出的屏幕截图:

enter image description here

最佳答案

Mojo::DOM 期望使用字符,而不是 UTF-8 编码字节,因此它很可能解码 &nbsp;到一个字符,然后需要在输出之前将其编码为 UTF-8。旧的 CGI 模块不会像现代框架那样解码您的输入参数或编码您的输出。所以你需要自己处理:decode $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>';
}

关于perl - 使用 Mojo::DOM 时 NBSP 格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669861/

相关文章:

javascript - javascript 中是否有一种本地方法可以对 HTML 转义字符实体进行转义?

perl - 使用 Perl Test::More 时是否有函数名称约定?

perl - 如何在编译时从外部文件导入 Perl 代码?

perl - Perl 中的逗号在所有上下文中都是关联的吗?

linux - 哪些组合键与信号相关联

Python os.walk 支持 Unicode/UTF-8?

Python - 读取表情符号 Unicode 字符

sql-server - 如何在SQL Server/SQL Reporting Services上显示东方字母(汉字)?

php - 使用php创建汉字密码系统

javascript - 检测HTML元素是否包含特定字符实体