我从文件命令得到这个:
words.txt: Non-ISO extended-ASCII English text
我的linux终端是UTF-8,它显示了某些单词的正确内容,而其他单词则没有.以下是其中一些的输出:
condi<E3>conte<FA>dosajuda,mas não resolvemo<E7>ambiquepedagógico são fenómenos
您可以看到第3行和第5行正确识别带有重音符和特殊字符的单词,而其他行则没有.其他行的正确输出应为:condiã,conteúdos和moçambique.
如果我使用binmode(STDOUT,utf8),“错误”行现在正确输出而其他行不正确.例如第3行:
ajuda,mas não resolve
我该怎么办?
解决方法 它的工作原理如下:C:\Dev\Perl :: chcpAktive codepage: 1252.C:\Dev\Perl :: type mixed-enCoding.txteins zwei drei Käse vIEr fünf Wursteins zwei drei Käse vIEr fünf WurstC:\Dev\Perl :: perl mixed-enCoding.pl < mixed-enCoding.txteins zwei drei vIEr fünfeins zwei drei vIEr fünf
mixed-enCoding.pl的位置如下:
use strict;use warnings;use utf8; # source in UTF-8use 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 latin1use 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 – 文件编码和单词比较全部内容,希望文章能够帮你解决Perl – 文件编码和单词比较所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)