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

У меня есть Perl-скрипт, который вызывается третьими лицами для отправки мне имен людей, которые зарегистрировали мое программное обеспечение. Одна из этих сторон кодирует имена в UTF-8, поэтому я соответствующим образом адаптировал свой скрипт для декодирования UTF-8 в ASCII с помощью Encode :: decode_utf8 (...).

Обычно это работает нормально, но каждые 6 месяцев или около того одно из имен содержит символы кириллицы, греческого или румынского алфавита, поэтому расшифровка имени приводит к появлению таких мусорных символов, как " ». Я должен связаться с клиентом и попросить у него «латинскую версию» его имени, чтобы выдать регистрационный код.

Итак, есть ли какой-нибудь модуль Perl, который может определять наличие таких символов и автоматически переводить их в их ближайшее ASCII-представление при необходимости?

Кажется, что я могу использовать Lingua :: Cyrillic :: Translit :: ICAO плюс Lingua :: DetectCharset для обработки кириллицы, но я бы предпочел что-то, что работает и с другими наборами символов.

Ответы [ 4 ]

12 голосов
/ 12 марта 2009

Я полагаю, вы могли бы использовать Text :: Unidecode для этого, это именно то, что он пытается сделать.

0 голосов
/ 30 сентября 2014

В документации для Text :: Unicode в разделе «Предостережения» указывается, что эта фраза неверна:

Убедитесь, что входные данные действительно являются строкой 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);
0 голосов
/ 12 марта 2009

Если вы получаете кириллический текст, для многих символов нет «ближайшего представления ASCII».

0 голосов
/ 12 марта 2009

Если вам приходится иметь дело с данными UTF-8, которые не входят в диапазон ASCII, лучше всего изменить свой бэкэнд, чтобы он не давился UTF-8. Как бы вы пошли о транслитерации знаков кандзи?

...