如何在Perl中读取ISO 8859-1(Latin-1)编码的文本

8

我正在尝试编写一个perl脚本来读取一个使用Latin-1编码的文件,但是出现了问题。当我尝试搜索一个我知道在文件中存在的字符(它在第一行中),什么也没搜索到。我尝试使用use encoding "iso 8859-1";来指定编码方式,但我也尝试过binmode(STDIN, ":utf8");。有什么建议吗?我可能做错了什么,应该怎么做才对?

use encoding "iso 8859-1";

while(<>)
{
    if(/ó/gi)
    {
    print "Found one!\n";
    }
}
1个回答

18
不要使用“use encoding”编译指示:它已经失效了。在这里指定编码方式:
use open ":encoding(Latin1)";

或将其放在开放的位置:
open(FH, "< :encoding(Latin1)", $pathname)
   || die "can't open $pathname: $!";

或者在打开后使用binmode

binmode(FH, ":encoding(Latin1)")
   || die "can't binmode to encoding Latin1";

如果您正在使用<ARGV>,那么use open可能是最简单的方法。 同时也不要忘记在输出流上设置编码。

2
另一个问题是脚本使用ó作为字面字符,因此需要确定其编码方式。 - cjm
@cjm:唉,你说得对。我以前就被“use encoding”搞糊涂了。现在我的程序文本要么是纯7位ASCII码,要么是带有“use utf8”编译指示的UTF-8编码,因为我知道那个可行。 - tchrist
第一种解决方案不起作用,第二种也不行,但如果我使用第二种和第三种,它就可以工作了。我想现在只能暂时满足于此了。 - John Montgomery
1
@John:除非您的源代码是utf8并且已经声明,否则我不会写/ó/。我会写/\xF3/。重音仍然存在问题:您是否希望它与无重音或不同重音的字符匹配?如果是这样,您需要进行NFD和去标记处理。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接