我到处尝试学习并解决这个问题,但我还没到任何地方。
让我们拿一个字符串:
蛋白杏仁饼干甜点松饼。糖李子曲奇饼蛋白杏仁饼干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吗?
答案 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的工具来处理它,而不必考虑它。