【问题标题】:Replace Unicode numeral subscript or superscript with plain numeral用普通数字替换 Unicode 数字下标或上标
【发布时间】:2012-03-19 04:49:49
【问题描述】:

如何使用正则表达式将 Unicode 数字下标或上标(例如)替换为相应的数字(即2)?我当然可以分别替换它们,但那是十行代码......

我在 Perl 中实现了这一点,但这并不重要。

【问题讨论】:

  • 使用ord函数怎么样,例如2 (u2802) => 50
  • $x =~ tr/1234/abcd/ # convert 1 → a, 2 → b, 3 → c, 4 → d
  • 当我这样做 $x =~ tr/₂₃/23/ 时,CO₂ 之类的简单物质会转化为 CO233。
  • 正如我在对 tchrist 的回答的评论中已经提到的那样,添加 use utf8 使 tr/₂₃/23/ 对 Perl 脚本中定义的字符串正常工作。添加use open qw[:std IO :utf8] 使其也适用于从其他来源读取的字符串。

标签: regex perl unicode superscript unicode-normalization


【解决方案1】:

这里来自the unisupers script 是一个转换为 Unicode 上标的 Perl 函数:

sub convert_to_superscripts (_) {
   my $string = $_[0];
   $string =~ tr[+−=()0123456789AaÆᴂɐɑɒBbcɕDdðEeƎəɛɜɜfGgɡɣhHɦIiɪɨᵻɩjJʝɟKklLʟᶅɭMmɱNnɴɲɳŋOoɔᴖᴗɵȢPpɸrRɹɻʁsʂʃTtƫUuᴜᴝʉɥɯɰʊvVʋʌwWxyzʐʑʒꝯᴥβγδθφχнნʕⵡ]
                [⁺⁻⁼⁽⁾⁰¹²³⁴⁵⁶⁷⁸⁹ᴬᵃᴭᵆᵄᵅᶛᴮᵇᶜᶝᴰᵈᶞᴱᵉᴲᵊᵋᶟᵌᶠᴳᵍᶢˠʰᴴʱᴵⁱᶦᶤᶧᶥʲᴶᶨᶡᴷᵏˡᴸᶫᶪᶩᴹᵐᶬᴺⁿᶰᶮᶯᵑᴼᵒᵓᵔᵕᶱᴽᴾᵖᶲʳᴿʴʵʶˢᶳᶴᵀᵗᶵᵁᵘᶸᵙᶶᶣᵚᶭᶷᵛⱽᶹᶺʷᵂˣʸᶻᶼᶽᶾꝰᵜᵝᵞᵟᶿᵠᵡᵸჼˤⵯ];
   return $string;
}

the unisubs script 是一个下标:

sub convert_to_subscripts (_) {
   my $string = $_[0];
   $string =~ tr[+−=()0123456789aeəhijklmnoprstuvxβγρφχ]
                [₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₔₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ];
   return $string;
}

你只需要走另一条路。

另一种更简单的方法是简单地使用 k-compat 规范化,它只返回基本字符而不是它们的上/下版本。我还没有检查这些是否都是上述函数的逆函数。您可以使用nfkd 和他们一起玩 nfkc 脚本。

【讨论】:

  • |Q| 做什么和|QQ|链接脚本中的行是什么意思?那些像 bash 中的 HERE 文档?
  • @2ck 是的,没错。 |Q||QQ| 前缀是为了便于阅读;它们被deQdeQQ 以及最终的dequeue 函数剥离(是的,这应该是一组有趣的名称)。如果您正在使用一堆 Unicode,您可能会在封闭目录中查找其他脚本,尤其是 uniprops、unichars、uninames。 CPAN Unicode::Tussle 套件将为您安装所有这些,并且对每个都有一些描述。
  • NFKD 在链接脚本中工作正常,但在我的脚本中吐出: â 我想,我必须在某个地方正确定义我的编码,如果我在脚本中键入 2,我会得到 â,如果我读到通过 ARGV[0] 输入文本文件,然后从 $line 我也得到 â.
  • @sseelenluft Some of those scripts 期望您将PERL_UNICODE 环境变量设置为SSDSAD。我对此并不总是很好。
  • @sseelenluft 您是否将use utf8 放入脚本中?在这里,我从4th edition of Programming Perl 中浏览了一些 Unicode 配方,在这个 Perl Unicode Cookbook 手册页中可能对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 2023-04-04
  • 2020-01-20
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2022-07-07
  • 2011-02-10
相关资源
最近更新 更多