例如,匹配"民族报"在""国际化"没有额外的模块,是否有可能在新的Perl版本(5.14,5.15等)?
我找到了答案!感谢tchrist
与UCA匹配的Rigth解决方案(thnx到/sf/users/32989071/).
# found start/end offsets for matched utf-substring (without intersections)
use 5.014;
use strict;
use warnings;
use utf8;
use Unicode::Collate;
binmode STDOUT, ':encoding(UTF-8)';
my $str = "Îñ?érñå?îöñå?îžå?îöñ" x 2;
my $look = "Nation";
my $Collator = Unicode::Collate->new(
normalization => undef, level => 1
);
my @match = $Collator->match($str, $look);
if (@match) {
my $found = $match[0];
my $f_len = length($found);
say "match result: $found (length is $f_len)";
my $offset = 0;
while ((my $start = …Run Code Online (Sandbox Code Playgroud) 我可以在vim中这样做:
:%s/\%u2013/-/g
Run Code Online (Sandbox Code Playgroud)
我如何在Perl中执行等效操作?我以为这会做到但它似乎没有起作用:
perl -i -pe 's/\x{2013}/-/g' my.dat
Run Code Online (Sandbox Code Playgroud) 我有这个测验应用程序,我匹配人们输入的正确答案.就目前而言,我所做的基本上是:
if ($input =~ /$answer/i) {
print "you won";
}
Run Code Online (Sandbox Code Playgroud)
这很好,好像答案是"鱼",用户可以输入"一条鱼"并被认为是一个很好的答案.
我面临的问题是,我的用户因为我是法国人,我希望能够接受用户输入"taton",答案是"tâton".
那么,我能做的是:
use POSIX qw(locale_h);
use locale;
setlocale(LC_TYPE, "fr_FR.ISO8859-15");
setlocale(LC_COLLATE, "fr_FR.ISO8859-15");
Run Code Online (Sandbox Code Playgroud)
在我的检查程序中,做一个:
$input = lc($input);
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;
Run Code Online (Sandbox Code Playgroud)
还有同样的答案.
我不喜欢它,因为我必须硬编码,而当我决定我将离开ISO-8859-15世界的UTF-8世界时,我注定要失败.
所以,我正在寻找一种方式来比较字符串,这将使"tâton" eq "taton","maçon" eq "macon"或者"macon" =~ /maçon/是真实的.
我需要一个通用的音译或替换正则表达式,它将扩展的拉丁字符映射到类似的ASCII字符,并将所有其他扩展字符映射到''(空字符串),以便......
é变成了e
ê成为e
á成为一个
ç变成c
Ď成为D.
等等,但是像‡或Ω或‰这样的东西只是被条纹化了.
我正在寻找建议我应该使用哪些库和/或函数将国际文本转换为它的英文字符替代品.
例如
Vous avez aimé l'épée offerte par les elfes à Frodon
Run Code Online (Sandbox Code Playgroud)
转换成
Vous avez aime l'epee offerte par les elfes a Frodon
Run Code Online (Sandbox Code Playgroud)