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

时间:2014-07-13 13:12:41

标签: perl character-encoding

我到处尝试学习并解决这个问题,但我还没到任何地方。

让我们拿一个字符串:

  

蛋白杏仁饼干甜点松饼。糖李子曲奇饼蛋白杏仁饼干soufflé棒棒糖   糖果布朗尼提拉米苏羊角面包。硅片冰淇淋巧克力棒   橡皮糖。芝士蛋糕粉chupa chups。甜甜圈糕点糖果手杖。   Liquorice tootsie roll candy candy canes-o。芝麻快速应用   糖梅花蛋糕苹果派。巧克力冰淇淋棉花糖   蛋奶酥。 Apple pie danish unerdwear.com wafer unerdwear.com muffin   适用布丁。果冻棉花糖果仁巧克力棒棒糖蛋白杏仁饼干甜   卷胡萝卜蛋糕巧克​​力棒。馅饼棒棒糖饼干unerdwear.com   gummies粉末。果冻halvah苹果派布丁焦糖小杏仁饼。   小杏仁饼果冻o顶部馅饼粉末结冰。 Gummies jelly-o tiramisu   熊爪布朗尼芝士蛋糕。结冰饼燕麦蛋糕棒棒糖胡萝卜蛋糕   奶糖。甜甜圈果冻糖李子松饼。水果蛋糕提拉米苏枣   松饼蛋挞果冻馅饼水果蛋糕。 Unerdwear.com jujubes unerdwear.com   gummi熊果冻豆果仁巧克力蛋白杏仁饼干。小杏仁饼halvah蛋糕tootsie   卷棉花糖棉花糖甜甜圈。 Soufflé威化饼干糖果胡萝卜   蛋糕。芝士蛋糕松饼粉gummies胡萝卜蛋糕。 Halvah冰淇淋   适用甘草蛋白杏仁饼干苹果派蛋糕。蛋糕dragée甘草。   糖李子饼干halvah。胡萝卜糕棒棒糖甜点糖果。糖果   手杖小杏仁饼棉花糖丹麦蛋糕果冻o布朗尼饼干燕麦   饼。

当我这样做时:

Encode::encode('UTF-8', $text);

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

当我看到这个时,我不认为它是任何代码点或任何有效的编码映射(即é)。我怎么能期望它能以正确读取的方式到达目的地?换句话说,为什么Perl在我将其编码为UTF8时会给我and,它应该给我é

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();
}

use utf8;似乎没有编码上面提到的字符串中的特殊字符,它仍然给出了“é”。让$writer->xmlDecl('utf-8')等同于use open qw(:std :utf8),因为我没有使用文件句柄或stdin / stdout吗?

1 个答案:

答案 0 :(得分:2)

  

当我看到这个时,我不认为它是任何代码点或任何有效的编码映射

如果你看the relevant page on fileformat.info,你会看到发生了什么。

最初,在您的程序中,您有一个Unicode字符“é”。 Unicode字符代码是U + 00E9。当您将该字符编码为UTF-8时,您将获得一个由两个字节组成的字符 - 0xC3 0xA9。如果你看the codepage for ISO-8859-1,你会看到0xC3是“Ô而0xA9是“©”。

如果您尝试在了解UTF-8且期望UTF-8的设备上显示该双字节字符,那么您将获得“é”。否则,设备将使用其原生字符编码(可能是ISO-8859-1),您将获得您所见过的Mojibake

作为tchrist says,最简单的方法是使用Perl的工具来处理它,而不必考虑它。