Как я могу преобразовать не-ASCII-символы, закодированные в UTF8, в ASCII-эквивалент в Perl?

StackOverflow https://stackoverflow.com/questions/638060

Вопрос

У меня есть 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top