在 Perl 中将 Unicode 数学 bold/italic 字符翻译成 latin-1

Translate Unicode mathematical bold/italic characters to latin-1 in Perl

Unicode 对粗体或斜体字符有单独的字符,例如U+1D43B 是斜体 H。有关这些列表,请参阅 https://unicode-search.net/unicode-namesearch.pl?term=mathematical

当用户从电子教科书上复制化学式时,他们实际上可能复制的是这些字符而不是 Latin-1 字符,因此他们复制的不是 "H2O",而是 "U+1D43B U+2082 U+1D442"。当他们将其粘贴到搜索表单中时,它 看起来 像 H2O。但是他们不会得到任何结果,因为它不是拉丁字符。

所以,我需要将这些字符翻译成 Perl 中的 Latin-1 字符。 Text::Unidecode 库似乎无法识别这些。

我试过使用音译,

 y/\x{1d434}-\x{1d467}/A-Za-z/

但这似乎根本不起作用。

有没有办法在 unicode 字符范围上使用翻译运算符?或者是否有图书馆可以做到这一点?

实际上它确实有效。

use open ':std', ':encoding(UTF-8)';

my $s = "\N{U+1D43B}\N{U+2082}\N{U+1D442}";
say sprintf "%vX", $s;
$s =~ y/\x{1d434}-\x{1d467}/A-Za-z/;
say sprintf "%1$vX %1$s", $s;

输出:

1D43B.2082.1D442
48.2082.4F H₂O

也许您实际上并没有您描述的三字串?也许您有使用 UTF-8 编码的文本?

实际上,音译运算符确实有效。这是确保变量被正确编码的问题。

$str =~ y/\x{1d400}-\x{1d6a3}/A-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-zA-Za-z/r
  =~ y/\x{1d7ce}-\x{1d7ff}/0-90-90-90-90-9/r );

似乎有效。

但是,Unicode::Normalize::NDKD 效果更好。谢谢