Преобразование файла UTF-8 в ASCII (наилучшее усилие)

23

У меня есть файл в UTF-8, который содержит тексты на нескольких языках. Во многом это имена людей. Мне нужно преобразовать его в ASCII, и мне нужно, чтобы результат выглядел максимально прилично.

Есть много способов приблизиться к преобразованию из более широкой кодировки в более узкую. Простейшим преобразованием было бы заменить все символы, не входящие в ASCII, на некоторый заполнитель, например '_' Если я знаю язык, на котором написан файл, есть дополнительные возможности, такие как латинизация.

Какой инструмент Unix или библиотека языков программирования, доступные в Unix, могут дать мне достойное (лучшее из возможного) преобразование из UTF-8 в ASCII?

Большая часть текста написана на европейских языках латинского типа.

user7610
источник
1
Вы знаете, где начинается какой язык? Есть, например, разница в том, как справляться с недоступностью умлаута (как на ö). На немецком языке вы всегда можете написать «oe», но, например, на голландском языке недоступность умлаута можно лучше «описать» с помощью тире, за которым следует умлаутый символ (а там «oe» будет совершенно другим дифтонгом)
Anthon
Как вы определяете «как можно более достойно»? Настоящая сложность заключается в определении отображений. По сравнению с этим задача программирования тривиальна. Фактически используемые отображения сильно различаются и могут зависеть от языка двумя способами: они зависят от языка текста и предполагаемого языка читателя (особенно в том, что касается латинизации).
Юкка К. Корпела
@ JukkaK.Korpela «как можно более достойно», конечно, определяется теми, кто создал «инструмент Unix или библиотеку языков программирования, доступную в Unix», о которой я прошу. Если лучшее, что я получу, это заменить все, что не ASCII, подчеркиванием, тогда я не смогу сделать больше. За исключением написания моего собственного инструмента, который я не буду. Я думаю, что Unix @ SO, возможно, не лучшее место для этого вопроса ...
user7610
1
@ user7610 Кроме iconvи tr, есть Unidecode . Я не знаком с этим, но он может делать то, что вы хотите, если вы можете использовать Python.
Йеллоантфил
1
@yellowantphil или узел-unidecode в JavaScript / node, UnidecodeSharp в C♯ или Text :: Unidecode в Perl, который является первым из этого имени. Я предполагаю, что есть другие версии.
user7610

Ответы:

11
konwert utf8-ascii

Он будет выполнять конвертацию с максимальным усилием, в зависимости от таблиц конверсии. Если вы приблизительно знаете язык ввода, существуют фильтры для конкретного языка, которые дают лучшие результаты, например

konwert utf8-xmetodo

преобразование эсперанто в представление x-metodo,

konwert UTF8-tex

попробую сделать TeX представление диакритических знаков, есть языковые параметры:

konwert UTF8-ascii/de

будет транслитерировать "ä" на "ae" (обычно для немецкого языка) вместо простого "a"

konwert UTF8-ascii/rosyjski

будет использовать польские правила для транслитерации русского языка вместо "английских" и т. д.

Радован Гарабик
источник
Это последнее место на konwertсайте? Это упаковано где-нибудь? github.com/taw/konwert/tree/master/konwert-1.8
Немо
25

Это будет работать для некоторых вещей:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITвозвращается helloe ?. Любые символы, которые iconvне знают, как конвертировать, будут заменены знаками вопроса.

iconvэто POSIX, но я не знаю, есть ли у всех систем TRANSLITопция. Это работает для меня в Linux. Кроме того, IGNOREопция будет молча отбрасывать символы, которые не могут быть представлены в целевом наборе символов (см. man iconv_open).

Низкий, но POSIX-совместимый вариант должен использовать tr. Эта команда заменяет все кодовые точки, отличные от ASCII, знаком вопроса. Он читает текст UTF-8 по одному байту за раз. «É» может быть заменено на E?или ?, в зависимости от того, было ли оно закодировано с использованием комбинированного акцента или предварительно составленного символа.

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

Этот пример возвращается caf? ?????с использованием предварительно составленных символов.

yellowantphil
источник
trне предназначен для работы по одному байту за раз. GNU tr делает, но это ошибка.
Стефан Шазелас
3
iconv -f utf-8 -t ascii//TRANSLITработал хорошо для меня. Это изменило вьющиеся кавычки в прямые кавычки. Спасибо.
полковник Паник
Обратите внимание, что iconv будет задыхаться от персонажей с сильным акцентом, таких как пиньинь.
Свентечие
Обратите внимание, что это //TRANSLITтакже работает для других наборов символов, например iso-8859-1//TRANSLIT.
Скиппи ле Гран Гуру
iconvдает iconv: illegal input sequence at position 1234и усекает файл для меня. Было бы неплохо, если бы он просто удалил персонажа и попытался снова подобрать последовательность.
jozxyqk
2

У меня есть файл в UTF-8, который содержит [имена людей] на нескольких языках [которые я хочу преобразовать во что-то значимое в ASCII].

Вы имеете в виду, что хотите иметь возможность преобразовать следующие имена в некоторую строку ASCII, против которой заинтересованный человек не будет возражать?

  • ஸ்றீனிவாஸ ராமானுஜன் ஐயங்கார்
  • عبد الله الثاني بن الحسين

Я подозреваю, что нет автоматизированного инструмента, который может сделать это. Может быть или нет или очень много латинизации личных имен. Программное обеспечение не может выбрать культурно приемлемую версию. По крайней мере, без программного обеспечения, знающего много о культуре вовлеченного человека.

Смотрите также /programming//a/1398403/477035

RedGrittyBrick
источник
2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'производит `` bd llh lthny bn lHsyn` ', который является достаточно хорошей транслитерацией для моих целей.
user7610
4
@ user7610: Хорошо, но король Иордании Абдулла II может не согласиться. Я подготовил бы объяснение на случай, если кто-то важный пожаловался генеральному директору :-)
RedGrittyBrick
2

Я закончил тем, что использовал Perl с Text :: Unidecode для этого. Пример:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

производит bd llh lthny bn lHsyn, что является приемлемым результатом для моих целей.

user7610
источник