Perl Unicode 美食菜谱:转换非ASCII Unicode 数字
℞ 28: 转换非ASCII Unicode 数字
Unicode 数字涵盖了比ASCII字符 0 - 9 更多的内容。
除非你使用了 /a
或 /aa
,否则 \d
不仅匹配ASCII数字。这是好事!遗憾的是,Perl的隐式字符串到数字转换目前无法识别Unicode数字。下面是如何手动转换此类字符串的示例。
通常,Unicode::UCD 模块提供对Unicode字符数据库的访问。它的 num()
函数可以将Unicode数字以及Unicode数字的字符串转换为数字。
use v5.14; # needed for num() function
use Unicode::UCD qw(num);
my $str = "got Ⅻ and ४५६७ and ⅞ and here";
my @nums = ();
while (/$str =~ (\d+|\N)/g) { # not just ASCII!
push @nums, num($1);
}
say "@nums"; # 12 4567 0.875
use charnames qw(:full);
my $nv = num("\N{RUMI DIGIT ONE}\N{RUMI DIGIT TWO}");
正如 num()
的文档所警告的,该函数在安全方面存在偏差。并非所有Unicode数字的集合都构成有效的数字。此外,您可以考虑在执行数字转换之前规范化复杂的Unicode字符串。
上一页: ℞ 27: Unicode 规范化
系列索引: 标准序言
标签
反馈
这篇文章有什么问题吗?请通过在 GitHub 上打开一个issue或pull request来帮助我们。