Перетворення файлу UTF-8 в ASCII (найкращі зусилля)


23

У мене є файл в UTF-8, який містить тексти на декількох мовах. Дуже багато це імена людей. Мені потрібно конвертувати його в ASCII, і мені потрібен результат, щоб він виглядав максимально пристойно.

Існує багато способів підходу до перетворення від ширшого кодування до більш вузького. Найпростішим перетворенням було б замінити всі символи, що не належать до ASCII, на якийсь заповнювач, наприклад, "_". Якщо я знаю мову, в яку записаний файл, є додаткові можливості, наприклад, романізація.

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

Більшість тексту є європейськими, латинськими мовами.


1
чи знаєте ви, з якої мови починається мова? Існує, наприклад, різниця в тому, як поводитися з недоступністю умулату (як на ö). Німецькою мовою завжди можна писати "ое", але, наприклад, голландською мовою недоступність умлаута може бути краще "описана" тире, за яким слідує убитий символ (а там "ое" було б зовсім іншим дифтонгом)
Anthon

Як ви визначаєте "якомога пристойнішого"? Справжня складність полягає у визначенні відображень. Порівняно з цим завдання програмування є тривіальним. Насправді використовувані відображення сильно відрізняються і можуть бути специфічними для мови двома способами: вони залежать від мови тексту та від передбачуваної мови читача (особливо що стосується романізації).
Юкка К. Корпела

@ JukkaK.Korpela "якомога пристойніший", звичайно, визначається тими, хто створив "інструмент Unix або бібліотеку мов програмування, доступні в Unix", про які я прошу. Якщо найкраще, що я збираюсь, - це замінити все, що не є ASCII, на підкреслення, то я ще багато чого не можу зробити. За винятком написання власного інструменту, який я не хочу. Я думаю, що Unix @ SO може бути не найкращим місцем для цього питання…
user7610

1
@ user7610 Крім iconvі tr, існує Unidecode . Я не знайомий з цим, але це може зробити все, що ви хочете, якщо ви можете використовувати Python.
Yellowantphil

1
@yellowantphil або unde -unidecode в JavaScript / node, UnidecodeSharp в C♯ або Text :: Unidecode в Perl, який, як правило, є першим з цього імені. Я думаю, є й інші версії.
user7610

Відповіді:


11
konwert utf8-ascii

Це зробить найкращі зусилля перетворення, залежно від таблиць перетворення. Якщо ви приблизно знаєте мову введення, є фільтри, що відповідають специфіці мови, які дають кращі результати, наприклад

konwert utf8-xmetodo

- це перетворення есперанто в x-методологічне подання,

konwert UTF8-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? ?????, використовуючи попередньо складені символи.


trне призначений для роботи один байт за раз. GNU tr робить, але це помилка.
Стефан Шазелас

3
iconv -f utf-8 -t ascii//TRANSLITдобре працював для мене. Він змінив фігурні лапки на прямі. Спасибі.
Полковник Паніка

Зауважте, що iconv задихається від сильно наголошених символів, таких як Піньїн.
sventechie

Зверніть увагу, що //TRANSLITтакож працює для інших наборів символів, наприклад iso-8859-1//TRANSLIT.
Skippy le Grand Gourou

iconvдає iconv: illegal input sequence at position 1234і скорочує файл для мене. Було б добре, якби він просто видалив персонажа і спробував знову підібрати послідовність.
jozxyqk


2

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

Ви маєте на увазі, що хочете мати змогу перетворити наступні імена в якусь рядок ASCII, якій відповідна особа не заперечуватиме?

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

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

Дивіться також /programming//a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'створює `` bd llh lthny bn lHsyn`, що є досить хорошою транслітерацією для моїх цілей.
user7610

4
@ user7610: Чудово, але король Йорданії Абдулла II може не погодитися. Я б підготував пояснення у випадку, якщо хтось важливий скаржиться на генерального директора :-)
RedGrittyBrick

2

Я в кінцевому підсумку використав для цього Perl з текстом :: Unidecode . Приклад:

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

виробляє bd llh lthny bn lHsyn, що є прийнятним результатом для моїх цілей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.