Перевести символы Unicode математическим полужирным шрифтом / итальянским c в latin-1 в Perl - PullRequest
2 голосов
/ 17 июня 2020

Unicode имеет отдельные символы для полужирного или итальянского c символов, например, U + 1D43B является itali c H. См. https://unicode-search.net/unicode-namesearch.pl?term=mathematical для их списка.

Когда пользователь копирует химические формулы из электронного учебника c, они могут фактически копировать эти символы вместо символов Latin-1, поэтому вместо «H2O» они копируют «U + 1D43B U + 2082 U + 1D442». Он выглядит как H2O, когда они вставляют его в форму поиска. Но они не получат результатов, потому что это не латинские символы.

Итак, мне нужно перевести эти символы в символы Latin-1 в Perl. Библиотека Text :: Unidecode не распознает их. * Есть ли способ использовать оператор перевода для диапазонов символов Юникода? Или есть библиотека, которая это сделает?

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

На самом деле это работает.

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?

1 голос
/ 17 июня 2020

Собственно оператор транслитерации работает. Речь шла о том, чтобы переменная была правильно закодирована.

$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 работает лучше. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...