加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl – 文件编码和单词比较

发布时间:2020-12-16 06:27:26 所属栏目:大数据 来源:网络整理
导读:我有一个文件,每行有一个短语/术语,我从STDIN读到perl.我有一个停用词列表(如“á”,“s?o”,“é”),我希望将每个词与每个词进行比较,如果它们相等则删除.问题是我不确定文件的编码格式. 我从文件命令得到这个: words.txt: Non-ISO extended-ASCII English
我有一个文件,每行有一个短语/术语,我从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:DevPerl :: chcp
Aktive Codepage: 1252.

C:DevPerl :: type mixed-encoding.txt
eins zwei drei K?¤se vier f??nf Wurst
eins zwei drei K?se vier fünf Wurst

C:DevPerl :: 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 "@tokensn";
}

请注意,脚本不必以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 "@tokensn";
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读