在 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
效果更好。谢谢
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
效果更好。谢谢