使用Perl Encode模块无法对某些字符编码为iso-8859-1编码

时间:2010-06-03 05:29:32

标签: perl encoding

我有一个ISO-8859-1编码的HTML字符串。我需要将此字符串传递给HTML:Entities :: decode_entities(),用于将一些HTML ASCII代码转换为相应的字符。所以我使用模块HTML :: Parser :: Entities 3.65但是在decode_entities()操作之后我的整个字符串变为utf-8字符串。这种行为似乎很好,因为HTML :: Parse的文档。因为我需要这个字符串以ISO-8859-1格式进行进一步处理所以我使用Encode :: encode(“iso-8859-1”,$ str)将字符串更改回ISO-8859-1编码。 我的结果很好,除了一些字符,一个问号即将到来。一个例子是单引号'ASCII码(')

如果Encode模块有任何限制,有人可以帮助我吗?任何其他指针也将有助于解决问题。 我粘贴了导致问题的char的示例文本:

my $str = "This is a test string to test the encoding of some chars like ’ “ ” etc these are failing to encode; some of them which encode correctly are é « etc.";

由于

2 个答案:

答案 0 :(得分:2)

third argument to encode,它控制着它的检查。默认设置是使用替换字符,但您可以将其设置为FB_CROAK以获取错误消息。

答案 1 :(得分:1)

根本问题是’“”所代表的字符在ISO-8859-1中不存在。你必须决定你想用它们做什么。

一些可能性:

使用cp1252,Microsoft的ISO-8859-1的“扩展”版本,而不是真实的东西。它确实包括那些角色。

在从utf-8转换为ISO-8859-1之前,重新编码ISO-8859-1范围之外的实体(加&):

my $toEncode = do { no warnings 'utf8'; "&\x{0100}-\x{10FFFF}" };
$string = HTML::Entities::encode_entities($string, $toEncode);

(需要no warnings位,因为尚未实际分配U + 10FFFF。)

还有其他可能性。这实际上取决于你想要完成的事情。