Транслитерация

135 views
Skip to first unread message

sVIKs

unread,
Nov 29, 2013, 5:24:27 AM11/29/13
to erlang-i...@googlegroups.com
Всем добрый день!

Никто не встречал транслитератор на английский с русского или/и украинского языка?

Сергей Прохоров

unread,
Nov 29, 2013, 6:31:49 PM11/29/13
to erlang-i...@googlegroups.com
Хоть это и нетипичная для Erlang задача, но, если я правильно понимаю, такую штуку можно написать за 10 минут.

translit(String) ->
    lists
:flatten([trans_chr(C) || C <- String]).


trans_chr
(1072) -> $a;
trans_chr
(1073) -> $b
trans_chr
(1074) -> $v;
trans_chr
(1075) -> $g;
trans_chr
(1076) -> $d;
...



пятница, 29 ноября 2013 г., 14:24:27 UTC+4 пользователь sVIKs написал:

Dmitrii Dimandt

unread,
Nov 29, 2013, 6:58:01 PM11/29/13
to Сергей Прохоров, erlang-i...@googlegroups.com
Жду написания за 10 минут правильной транслитерации Юникода, да ;)

Для действительно правильной транслитерации надо использовать, наверное https://github.com/erlang-unicode/i18n с трансформациями (http://userguide.icu-project.org/transforms) типа ‘Any-Latin; Latin-ASCII’ (http://userguide.icu-project.org/transforms/general#TOC-ICU-Transliterators) или ‘Any-Lower; Any-Latin; Latin-ASCII’ (играться тут: http://demo.icu-project.org/icu-bin/translit , почему-то сегодня Any-Latin отказывается работать на кириллице, надо еще ставить Cyrillic-Latin;)

Предположу, что это надо для slugs в URL’ах, тогда после трансформаций выше (или даже после 'Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();’) надо будет заменить пробелы на ‘-‘
--
Ви отримали це повідомлення, оскільки підписалися на групу "Erlang в Україні" Груп Google.
Щоб скасувати підписку на цю групу та не отримувати листів із неї, надішліть електронний лист на адресу erlang-in-ukra...@googlegroups.com.
Щоб залишати дописи в цій групі, надішліть електронного листа за адресою erlang-i...@googlegroups.com.
Перейдіть до цієї групи за посиланням http://groups.google.com/group/erlang-in-ukraine.

Anton Nikishaev

unread,
Nov 30, 2013, 5:55:27 AM11/30/13
to erlang-i...@googlegroups.com
Russian-English он называется.

Cyrillic-Latin, например, из чебурашки сделает čeburyška (и будет вполне прав)
signature.asc

Dmitrii Dimandt

unread,
Nov 30, 2013, 6:56:34 AM11/30/13
to Anton Nikishaev, erlang-i...@googlegroups.com
Cyrillic-Latin;

чебурашка -> čeburaška

Cyrillic-Latin; Latin-ASCII

чебурашка -> ceburaska

Почти норм :)

Единственное, почему-то Any-Latin активно отказывается транслитерировать всё, хотя, в теории, должен

- signature.asc, 465 bytes

Anton Nikishaev

unread,
Nov 30, 2013, 2:03:03 PM11/30/13
to erlang-i...@googlegroups.com

On 30 Nov 2013, at 15:56, Dmitrii Dimandt <dmi...@dmitriid.com> wrote:

> Cyrillic-Latin;
>
> чебурашка -> čeburaška
>
> Cyrillic-Latin; Latin-ASCII
>
> чебурашка -> ceburaska
>
> Почти норм :)
>

Ага. Ну кроме нескольких ошибок в одном слове. «Cheburashka» он(о)
>> - signature.asc, 465 bytes

Dmitrii Dimandt

unread,
Dec 1, 2013, 3:26:25 AM12/1/13
to Anton Nikishaev, erlang-i...@googlegroups.com
On 30 Nov 2013 at 20:06:02, Anton Nikishaev (anto...@gmail.com) wrote:

On 30 Nov 2013, at 15:56, Dmitrii Dimandt <dmi...@dmitriid.com> wrote: 

> Cyrillic-Latin; 
> 
> чебурашка -> čeburaška 
> 
> Cyrillic-Latin; Latin-ASCII 
> 
> чебурашка -> ceburaska 
> 
> Почти норм :) 
> 

Ага. Ну кроме нескольких ошибок в одном слове. «Cheburashka» он(о) 

С этим можно и нужно спорить ;) Почему cheburashka, а не tscheburaschka, например ;) Или czeburaszka

Yuri Zhloba

unread,
Dec 23, 2013, 4:49:24 PM12/23/13
to erlang-i...@googlegroups.com
-type(utf8_str() :: [integer()]).
-type(ascii_str() :: [byte()]).


-spec(translit(utf8_str()) -> ascii_str()).
translit(Data) ->
    translit(Data, []).


-spec(translit(utf8_str(), list()) -> ascii_str()).
translit([], Acc) -> lists:flatten(lists:reverse(Acc));
translit([Last], Acc) -> lists:flatten(lists:reverse([Last | Acc]));
translit([C1, C2 | Rest], Acc) ->
    case proplists:get_value({C1, C2}, translit_map()) of
        undefined -> translit([C2 | Rest], [C1 | Acc]);
        {Str, _} -> translit(Rest, [Str | Acc])
    end.


translit_map() ->
    L1 = [{208, N} || N <- lists:seq(144, 191)],
    L2 = [{209, N} || N <- lists:seq(128, 143)],
    D1 = [{"A", "А"}, {"B", "Б"}, {"V", "В"}, {"G", "Г"}, {"D", "Д"}, {"E", "Е"},
          {"Zh", "Ж"}, {"Z", "З"}, {"I", "И"}, {"J", "Й"}, {"K", "К"}, {"L", "Л"},
          {"M", "М"}, {"N", "Н"}, {"O", "О"}, {"P", "П"}, {"R", "Р"}, {"S", "С"},
          {"T", "Т"}, {"U", "У"}, {"F", "Ф"}, {"H", "Х"}, {"Ts", "Ц"}, {"Ch", "Ч"},
          {"Sh", "Ш"}, {"Shh","Щ"}, {"#", "Ъ"}, {"Y", "Ы"}, {"'", "Ь"}, {"Je", "Э"},
          {"Ju", "Ю"}, {"Ja", "Я"},
          {"a", "а "}, {"b", "б"}, {"v", "в"}, {"g", "г"}, {"d", "д"}, {"e", "е"},
          {"zh", "ж"}, {"z", "з"}, {"i", "и"}, {"j", "й"}, {"k", "к"}, {"l", "л"},
          {"m", "м"}, {"n", "н"}, {"o", "о"}, {"p", "п"}],
    D2 = [{"r", "р"}, {"s", "с"}, {"t", "т"}, {"u", "у"}, {"f", "ф"}, {"h", "х"},
          {"ts", "ц"}, {"ch", "ч"}, {"sh", "ш"}, {"shh","щ"}, {"#", "ъ"}, {"y", "ы"},
          {"'", "ь"}, {"je", "э"}, {"ju", "ю"}, {"ja", "я"}],
    [{{208, 129}, {"Yo", "Ё"}},
     {{209, 145}, {"yo", "ё"}},
     {{194, 171}, {"\"", "«"}},
     {{194, 187}, {"\"", "»"}}
    ] ++ lists:zip(L1, D1) ++ lists:zip(L2, D2).


translit_test() ->
    ?assertEqual("abvgd", translit("абвгд")),
    ?assertEqual("a b v g d", translit("а б в г д")),
    ?assertEqual("abv gd 100", translit("абв гд 100")),
    ?assertEqual("a-b/vgwwd", translit("а-б/вгwwд")),
    ?assertEqual("Vasilij Alibabaevich", translit("Василий Алибабаевич")),
    ?assertEqual("Vot vam telegramma ot gippopotama.", 
                 translit("Вот вам телеграмма от гиппопотама.")),
    ?assertEqual("Shtirlits el shhi s kapustoj, ishhi-svishhi ego teper'.",
                 translit("Штирлиц ел щи с капустой, ищи-свищи его теперь.")),
    ?assertEqual("Asteriks na Olimpijskih igrah HD",
                 translit("Астерикс на Олимпийских играх HD")),
    ?assertEqual("Afisha. Jekskljuzivnyj otryvok \"Zhizn' Adel'\"",
                 translit("Афиша. Эксклюзивный отрывок \"Жизнь Адель\"")),
    ?assertEqual("Veselaja koza: Legendy staroj Pragi",
                 translit("Веселая коза: Легенды старой Праги")),
    ?assertEqual("Vojna drakonov / Vojna dinozavrov HD",
                 translit("Война драконов / Война динозавров HD")),
    ?assertEqual("Zdravstvujte, my vasha krysha!",
                 translit("Здравствуйте, мы ваша крыша!")),
    ?assertEqual("Variant \"Omega\". 4 serija",
                 translit("Вариант «Омега». 4 серия")),
    ok.


сорри, скопипастил из проекта. Внятной отдельной либой не оформлено )

пятница, 29 ноября 2013 г., 13:24:27 UTC+3 пользователь sVIKs написал:

Dmitrii Dimandt

unread,
Dec 24, 2013, 4:25:37 AM12/24/13
to erlang-i...@googlegroups.com
Похожее в Zotonic’е. См. to_name: https://github.com/zotonic/z_stdlib/blob/master/src/z_string.erl#L445
--
Reply all
Reply to author
Forward
0 new messages