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 规范化

系列索引: 标准序言

下一页: ℞ 29: 在正则表达式中匹配 Unicode 图形群

标签

反馈

这篇文章有什么问题吗?请通过在 GitHub 上打开一个issue或pull request来帮助我们。