如何在Perl中将带重音符号和其他外来字符编码为UTF8

a7o*_*ton 5 perl character-encoding

我在任何地方都尝试过学习并设法解决这个问题,但是我什么也没得到。

让我们取一个字符串:

蛋白杏仁饼干甜点松饼。糖李子饼干杏仁饼蛋奶酥棒棒糖糖果布朗尼提拉米苏牛角包。威化饼干冰淇淋巧克力软糖。芝士蛋糕粉chupa chups。甜甜圈糕点糖果手杖。甘草软糖卷糖果棒果冻-o。芝麻snap花糖梅蛋糕苹果派。巧克力冰淇淋棉花糖蛋奶酥。苹果派丹麦菜unerdwear.com薄饼unerdwear.com松饼涂抹布丁。果冻棉花糖布朗尼棒棒糖蛋白杏仁饼干甜卷胡萝卜蛋糕巧克​​力棒。酸的棒棒糖饼干unerdwear.com软糖粉。果冻酥糖苹果派布丁焦糖小杏仁饼。小杏仁饼果冻-O型浇头派粉糖衣。软糖果冻o提拉米苏熊爪布朗尼芝士蛋糕。糖霜燕麦蛋糕棒棒糖胡萝卜蛋糕太妃糖。甜甜圈果冻糖梅花松饼。水果蛋糕提拉米苏枣松饼蛋j果冻派水果蛋糕。Unerdwear.com枣unerdwear.com gummi熊软糖布朗尼杏仁饼。小杏仁饼酥糖蛋糕tootsie卷棉花糖棉花糖甜甜圈。Soufflé威化棒棒糖胡萝卜糕。芝士蛋糕松饼粉软糖胡萝卜蛋糕。酥油冰淇淋应用甘草杏仁饼苹果派蛋糕。蛋糕糖衣甘草。糖李子饼干酥糖。胡萝卜糕棒棒糖甜糖果。糖果棒小杏仁饼棉花糖丹麦蛋糕果冻-o布朗尼饼干燕麦蛋糕。蛋糕糖衣甘草。糖李子饼干酥糖。胡萝卜糕棒棒糖甜糖果。糖果棒小杏仁饼棉花糖丹麦蛋糕果冻-o布朗尼饼干燕麦蛋糕。蛋糕糖衣甘草。糖李子饼干酥糖。胡萝卜糕棒棒糖甜糖果。糖果棒小杏仁饼棉花糖丹麦蛋糕果冻-o布朗尼饼干燕麦蛋糕。

当我做:

Encode::encode('UTF-8', $text);
Run Code Online (Sandbox Code Playgroud)

在该字符串上,单词Soufflé被编码为Soufflé。

当我看到它时,我不会将其识别为任何代码点或任何有效的编码映射(即é)。我如何期望它以正确读取的方式到达目的地?换句话说,当我将Perl编码为UTF8时,为什么Perl会给我é é

xmlbody($text);

sub xmlbody {
    $description = shift;

    use XML::Writer;
    my $writer = XML::Writer->new( OUTPUT => 'self', ENCODING => 'utf-8' );
    my $writer->xmlDecl('utf-8');

    ## ...structure

    $writer->cdataElement('description',$description);

    ## ...more structure

    $writer->end();
}
Run Code Online (Sandbox Code Playgroud)

use utf8;似乎没有在上述字符串中编码特殊字符,它仍然给出“Ô。因为我没有使用filehandle或stdin / stdout,所以会$writer->xmlDecl('utf-8')等同于use open qw(:std :utf8)吗?

Dav*_*oss 2

\n

当我查看此内容时,我不认为它是任何代码点或任何有效的编码映射

\n
\n\n

如果您查看fileformat.info 上的相关页面,您就会看到发生了什么。

\n\n

最初,在您的程序中有一个 Unicode 字符“\xc3\xa9”。其 Unicode 字符代码为 U+00E9。当将该字符编码为 UTF-8 时,您会得到一个由两个字节组成的字符 - 0xC3 0xA9。如果您查看ISO-8859-1 的代码页,您会看到 0xC3 是“\xc3\x83”,0xA9 是“\xc2\xa9”。

\n\n

如果您尝试在理解 UTF-8 且需要 UTF-8 的设备上显示该两字节字符,那么您将得到“\xc3\xa9”。否则,设备将使用其本机字符编码(可能是 ISO-8859-1),您将获得您所看到的Mojibake 。

\n\n

正如tchrist 所说,处理这个问题的最简单方法是使用 Perl 的工具来处理它,而无需您考虑它。

\n