无需猜测。有关UTF-8,ISO-8859-1和US-ASCII的特定选项,您可以使用 编码:: FixLatin 的 fix_latin 。它的 几乎可以保证成功 。
fix_latin
也就是说,我认为在OP中使用ISO-8859-1是ISO-8859-15的错字。
使用的方法 fix_latin ISO-8859-15和ISO-8859-1的效果一样好。这只是一个替换问题 _init_byte_map 以下内容:
_init_byte_map
sub _init_byte_map { foreach my $i (0x80..0xFF) { my $byte = chr($i); my $utf8 = Encode::from_to($byte, 'iso-8859-15', 'UTF-8'); $byte_map->{$byte} = $utf8; } }
或者,如果您愿意假设数据是一种编码或另一种编码(而不是混合),您还可以使用以下方法:
my $text; if (!eval { $text = decode("UTF-8", $bytes, Encode::FB_CROAK|Encode::LEAVE_SRC); 1 # No exception }) { $text = decode("ISO-8859-15", $bytes); }
请记住,US-ASCII是UTF-8和ISO-8859-15的合适子集,因此不需要特别处理。