【发布时间】:2016-11-12 07:58:27
【问题描述】:
我正在尝试找出许多输入字符串的编码,有些是 UTF-8,有些是 ISO-8859-1。不幸。
我正在使用带有Encode::Guess 的Perl,我很惊讶它无法处理简单的Latin1 编码。我正在使用 Encode::Guess 文档中的解码示例。
我一直在读取文件,但我也可以对字符串进行硬编码以获得相同的错误:
use Encode::Guess;
my $data = "The name \xc5sa is Swedish\n";
my $enc = guess_encoding($data,qw/latin1 utf8 ascii/);
ref($enc) or die "Can't guess: $enc\nFOR: $data";
我得到:
Can't guess: No appropriate encodings found!
FOR: The name �sa is Swedish
虽然在我的编辑器中,我看到“Åsa”的第一个字符是 Aring。
Perl 是否预先确定了编码,因为它是一个字符串,而不是一组打包的二进制数据,这就是破坏这一点的原因吗?
我在读取文件时尝试了use open ":encoding(Latin1)";,错误消失了,但它猜测编码是UTF-8。无论如何,该文件逐行混合了 UTF-8 和 Latin1,所以我想为每一行运行 Encode::Guess。
我还在文件句柄上尝试了binmode,但仍然看到错误。
【问题讨论】:
-
如果文件包含 Latin-1 和 UTF8 的混合(甚至可能是一些 CP1252),那么我建议您尝试Encoding::FixLatin。
-
始终使用
use strict; use warnings 'all';!!!如果你有,你的代码会产生Use of uninitialized value $_ in pattern match (m//) at a.pl line 3. -
@GrantMcLean:也许你应该说这是你自己的模块?
-
不好意思(缺少“qw”)-我已经更新了问题。
-
@DavidLjungMadison:下面我的解决方案还没有解决什么问题?
标签: perl encoding utf-8 iso-8859-1