Как я могу преобразовать не-ASCII-символы, закодированные в UTF8, в ASCII-эквивалент в Perl?
-
10-07-2019 - |
Вопрос
У меня есть Perl-скрипт, который вызывается третьими лицами для отправки мне имен людей, которые зарегистрировали мое программное обеспечение. Одна из этих сторон кодирует имена в UTF-8, поэтому я соответствующим образом адаптировал свой скрипт для декодирования UTF-8 в ASCII с помощью Encode :: decode_utf8 (...). Р>
Обычно это работает нормально, но каждые 6 месяцев или около того одно из имен содержит символы кириллицы, греческого или румынского алфавита, поэтому декодирование имени приводит к появлению мусорных символов, таких как " & # 208; & # 376; & # 208; & # 190; & # 208; & # 180; & # 209; & # 8364; & # 208; & # 176; & # 208; & # 182; & # 208; & # 176; & # 208; & # 189; & # 209; & # 208; & # 186; & # 208; & # 176; & # 209; & Quot ;. Я должен связаться с клиентом и попросить у него «версию для латинского персонажа» его имя для того, чтобы выдать регистрационный код. Р>
Итак, есть ли какой-нибудь модуль Perl, который может определить наличие таких символов и автоматически преобразовать их в их ближайшее ASCII-представление, если это необходимо? Р>
Кажется, что я могу использовать Lingua :: Cyrillic :: Translit :: ICAO плюс Lingua :: DetectCharset для обработки кириллицы, но я бы предпочел что-то, что работает и с другими наборами символов. Р>
Решение
Полагаю, вы могли бы использовать Text :: Unidecode для этого, это точно что он пытается сделать.
Другие советы
Если вам приходится иметь дело с данными UTF-8, которых нет в диапазоне ASCII, лучше всего изменить свой бэкэнд, чтобы он не подавлялся UTF-8. Как бы вы пошли о транслитерации знаков кандзи?
Если вы получаете кириллический текст, «ближайшего представления ASCII» не существует. для многих персонажей.
В документации для Text :: Unicode в разделе "Caveats" указывается, что эта фраза неверна:
Убедитесь, что входные данные действительно являются строкой utf8.
UTF-8 - кодировка переменной длины, тогда как Text :: Unidecode принимает только кодирование фиксированной длины (двухбайтовое) для каждого символа. Так что это предложение должно гласить:
Убедитесь, что входные данные действительно являются строкой двухбайтовых символов Юникода.
Это также упоминается как UCS-2.
Если вы хотите преобразовать строки, которые на самом деле являются utf8, вы должны сделать это так:
my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);