У меня есть файл в UTF-8, который содержит тексты на нескольких языках. Во многом это имена людей. Мне нужно преобразовать его в ASCII, и мне нужно, чтобы результат выглядел максимально прилично.
Есть много способов приблизиться к преобразованию из более широкой кодировки в более узкую. Простейшим преобразованием было бы заменить все символы, не входящие в ASCII, на некоторый заполнитель, например '_' Если я знаю язык, на котором написан файл, есть дополнительные возможности, такие как латинизация.
Какой инструмент Unix или библиотека языков программирования, доступные в Unix, могут дать мне достойное (лучшее из возможного) преобразование из UTF-8 в ASCII?
Большая часть текста написана на европейских языках латинского типа.
character-encoding
text
natural-language
user7610
источник
источник
iconv
иtr
, есть Unidecode . Я не знаком с этим, но он может делать то, что вы хотите, если вы можете использовать Python.Ответы:
Он будет выполнять конвертацию с максимальным усилием, в зависимости от таблиц конверсии. Если вы приблизительно знаете язык ввода, существуют фильтры для конкретного языка, которые дают лучшие результаты, например
преобразование эсперанто в представление x-metodo,
попробую сделать TeX представление диакритических знаков, есть языковые параметры:
будет транслитерировать "ä" на "ae" (обычно для немецкого языка) вместо простого "a"
будет использовать польские правила для транслитерации русского языка вместо "английских" и т. д.
источник
konwert
сайте? Это упаковано где-нибудь? github.com/taw/konwert/tree/master/konwert-1.8Это будет работать для некоторых вещей:
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
возвращаетсяhelloe ?
. Любые символы, которыеiconv
не знают, как конвертировать, будут заменены знаками вопроса.iconv
это POSIX, но я не знаю, есть ли у всех системTRANSLIT
опция. Это работает для меня в Linux. Кроме того,IGNORE
опция будет молча отбрасывать символы, которые не могут быть представлены в целевом наборе символов (см.man iconv_open
).Низкий, но POSIX-совместимый вариант должен использовать
tr
. Эта команда заменяет все кодовые точки, отличные от ASCII, знаком вопроса. Он читает текст UTF-8 по одному байту за раз. «É» может быть заменено наE?
или?
, в зависимости от того, было ли оно закодировано с использованием комбинированного акцента или предварительно составленного символа.Этот пример возвращается
caf? ?????
с использованием предварительно составленных символов.источник
tr
не предназначен для работы по одному байту за раз. GNU tr делает, но это ошибка.iconv -f utf-8 -t ascii//TRANSLIT
работал хорошо для меня. Это изменило вьющиеся кавычки в прямые кавычки. Спасибо.//TRANSLIT
также работает для других наборов символов, напримерiso-8859-1//TRANSLIT
.iconv
даетiconv: illegal input sequence at position 1234
и усекает файл для меня. Было бы неплохо, если бы он просто удалил персонажа и попытался снова подобрать последовательность.пытаться
uni2ascii -B input.txt >output.txt
uni2ascii
источник
Вы имеете в виду, что хотите иметь возможность преобразовать следующие имена в некоторую строку ASCII, против которой заинтересованный человек не будет возражать?
Я подозреваю, что нет автоматизированного инструмента, который может сделать это. Может быть или нет или очень много латинизации личных имен. Программное обеспечение не может выбрать культурно приемлемую версию. По крайней мере, без программного обеспечения, знающего много о культуре вовлеченного человека.
Смотрите также /programming//a/1398403/477035
источник
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
производит `` bd llh lthny bn lHsyn` ', который является достаточно хорошей транслитерацией для моих целей.Я закончил тем, что использовал Perl с Text :: Unidecode для этого. Пример:
производит
bd llh lthny bn lHsyn
, что является приемлемым результатом для моих целей.источник