Perl – 文件编码和单词比较

前端之家收集整理的这篇文章主要介绍了Perl – 文件编码和单词比较前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个文件,每行有一个短语/术语,我从STDIN读到perl.我有一个停用词列表(如“á”,“são”,“é”),我希望将每个词与每个词进行比较,如果它们相等则删除.问题是我不确定文件的编码格式.

我从文件命令得到这个:

words.txt: Non-ISO extended-ASCII English text

我的linux终端是UTF-8,它显示了某些单词的正确内容,而其他单词则没有.以下是其中一些的输出

condi<E3>
conte<FA>dos
ajuda,mas não resolve
mo<E7>ambique
pedagógico são fenómenos

您可以看到第3行和第5行正确识别带有重音符和特殊字符的单词,而其他行则没有.其他行的正确输出应为:condiã,conteúdos和moçambique.

如果我使用binmode(STDOUT,utf8),“错误”行现在正确输出而其他行不正确.例如第3行:

ajuda,mas não resolve

我该怎么办?

解决方法

它的工作原理如下:

C:\Dev\Perl :: chcp
Aktive Codepage: 1252.

C:\Dev\Perl :: type mixed-encoding.txt
eins zwei drei Käse vier fünf Wurst
eins zwei drei Käse vier fünf Wurst

C:\Dev\Perl :: perl mixed-encoding.pl < mixed-encoding.txt
eins zwei drei vier fünf
eins zwei drei vier fünf

mixed-encoding.pl的位置如下:

use strict;
use warnings;
use utf8; # source in UTF-8
use Encode 'decode_utf8';
use List::MoreUtils 'any';

my @stopwords = qw( Käse Wurst );

while ( <> ) { # read octets
    chomp;
    my @tokens;
    for ( split /\s+/ ) {
        # Try UTF-8 first. If that fails,assume legacy Latin-1.
        my $token = eval { decode_utf8 $_,Encode::FB_CROAK };
        $token = $_ if $@;
        push @tokens,$token unless any { $token eq $_ } @stopwords;
    }
    print "@tokens\n";
}

请注意,脚本不必以UTF-8编码.只是如果你的脚本中有时髦的字符数据,你必须确保编码匹配,所以如果你的编码是UTF-8,请使用utf8,如果你的编码不​​是,则使用utf8.

根据tchrist的声音建议更新:

use strict;
use warnings;
# source in Latin1
use Encode 'decode';
use List::MoreUtils 'any';

my @stopwords = qw( Käse Wurst );

while ( <> ) { # read octets
        chomp;
        my @tokens;
        for ( split /\s+/ ) {
                # Try UTF-8 first. If that fails,assume 8-bit encoding.
                my $token = eval { decode utf8 => $_,Encode::FB_CROAK };
                $token    = decode Windows1252 => $_,Encode::FB_CROAK if $@;
                push @tokens,uc $token unless any { $token eq $_ } @stopwords;
        }
        print "@tokens\n";
}

猜你在找的Perl相关文章