gpt4 book ai didi

perl - 如何猜测 Perl 中字符串的编码?

转载 作者:行者123 更新时间:2023-12-03 10:40:57 24 4
gpt4 key购买 nike

我有一个 Unicode 字符串,但不知道它的编码是什么。当 Perl 程序读取此字符串时,是否有 Perl 将使用的默认编码?如果是这样,我怎样才能知道它是什么?

我正在尝试从输入中删除非 ASCII 字符。我在一些可以做到的论坛上找到了这个:

my $line = encode('ascii', normalize('KD', $myutf), sub {$_[0] = ''});

当没有指定输入编码时,上述内容将如何工作?应该像下面这样指定吗?
my $line = encode('ascii', normalize('KD', decode($myutf, 'input-encoding'), sub {$_[0] = ''});

最佳答案

要找出未知使用的编码,您只需尝试查看即可。模块 Encode::DetectEncode::Guess自动化。 (如果您在编译 Encode::Detect 时遇到问题,请尝试使用它的 fork Encode::Detective。)

use Encode::Detect::Detector;
my $unknown = "\x{54}\x{68}\x{69}\x{73}\x{20}\x{79}\x{65}\x{61}\x{72}\x{20}".
"\x{49}\x{20}\x{77}\x{65}\x{6e}\x{74}\x{20}\x{74}\x{6f}\x{20}".
"\x{b1}\x{b1}\x{be}\x{a9}\x{20}\x{50}\x{65}\x{72}\x{6c}\x{20}".
"\x{77}\x{6f}\x{72}\x{6b}\x{73}\x{68}\x{6f}\x{70}\x{2e}";
my $encoding_name = Encode::Detect::Detector::detect($unknown);
print $encoding_name; # gb18030

use Encode;
my $string = decode($encoding_name, $unknown);

我找到 encode 'ascii'是摆脱非ASCII字符的蹩脚解决方案。一切都将用问号代替;这太有损了,没有用。
# Bad example; don't do this.
use utf8;
use Encode;
my $string = 'This year I went to 北京 Perl workshop.';
print encode('ascii', $string); # This year I went to ?? Perl workshop.

如果你想要可读的 ASCII 文本,我推荐 Text::Unidecode反而。这也是一种有损编码,但没有普通的 encode 可怕。多于。
use utf8;
use Text::Unidecode;
my $string = 'This year I went to 北京 Perl workshop.';
print unidecode($string); # This year I went to Bei Jing Perl workshop.

但是,如果您能提供帮助,请避免使用那些有损编码。如果您想稍后撤消操作,请选择 PERLQQ 之一或 XMLCREF .
use utf8;
use Encode qw(encode PERLQQ XMLCREF);
my $string = 'This year I went to 北京 Perl workshop.';
print encode('ascii', $string, PERLQQ); # This year I went to \x{5317}\x{4eac} Perl workshop.
print encode('ascii', $string, XMLCREF); # This year I went to 北京 Perl workshop.

关于perl - 如何猜测 Perl 中字符串的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com