Знайомство з Erlang [6]
Розглянемо роботу зі строками, кирилицею та мультимовністю в erlang
Строки в ерлангу бувають двох видів -
- спискові строки (списки, list)
"test"
- бінарні строки (binary strings)
<<"test">>
Що ми можемо робити зі строками?
- об'єднувати (конкатенація)
1> "test1" ++ "test2".
"test1test2"
2> string:join(["111", "222", "333", "444", "555"],", ").
"111, 222, 333, 444, 555"
3> A = <<"test1">>.
<<"test1">>
4> B = <<"test2">>.
<<"test2">>
5> C = <<"тест"/utf8>>.
<<209,130,208,181,209,129,209,130>>
6> D = <<A/binary, B/binary, C/binary>>.
<<116,101,115,116,49,116,101,115,116,50,209,130,208,181,
209,129,209,130>>
7> io:format("~ts~n",[D]).
test1test2тест
ok
(5) -- так записується utf8 (кирилиця).
проте, з метою збільшення швидкодії,
рекомендується використовувати io lists (списки вводу-виводу) -
ми просто збираємо в один список всі необхідні для виводу дані, наприклад:
8> L = [A,B,C].
[<<"test1">>,<<"test2">>,
<<209,130,208,181,209,129,209,130>>]
9> io:format("~ts~n",[L]).
test1test2тест
ok
- брати частину строки, розділяти
10> A = <<"111222333444555">>.
<<"111222333444555">>
11> binary:part(A,5,3).
<<"233">>
12> binary:part(A,5,-3).
<<"122">>
13> binary:part(A,2,-3).
** exception error: bad argument
in function binary:part/3
called as binary:part(<<"111222333444555">>,2,-3)
14> binary:part(A,byte_size(A),-5).
<<"44555">>
15> binary:part(A,1,5).
<<"11222">>
16> binary:part(A,0,5).
<<"11122">>
17> <<B1:4/binary,_/binary>> = A.
<<"111222333444555">>
18> B1.
<<"1112">>
19> <<B1:4/binary, B2:2/binary, B3:4/binary,_/binary>> = A.
<<"111222333444555">>
20> B2.
<<"22">>
21> B3.
<<"3334">>
22> binary:split(<<"123.456.789">>,[<<".">>],[global]).
[<<"123">>,<<"456">>,<<"789">>]
23> binary:split(<<"123.456.789">>,[<<".">>,<<"5">>],[global]).
[<<"123">>,<<"4">>,<<"6">>,<<"789">>]
24> string:split("123.456.789",".",all).
["123","456","789"]
25> string:sub_string("1234567890",2,4).
"234"
- та інше - розмір строки в байтах, пошук підстрок та їх заміна
26> erlang:byte_size(<<"1122334455">>).
10
27> binary:match(<<"abc abc abc">>, <<"ab">>).
{0,2}
28> binary:matches(<<"abc abc abc">>, <<"ab">>).
[{0,2},{4,2},{8,2}]
29> binary:replace(<<"a-b-c-a-b-c">>, <<"a">>, <<"A">>).
<<"A-b-c-a-b-c">>
30> binary:replace(<<"a-b-c-a-b-c">>, <<"a">>, <<"A">>, [global]).
<<"A-b-c-A-b-c">>
Більше функцій роботи зі строками ви можете знайти в ерланг-документації:
https://erlang.org/doc/man/string.html
https://erlang.org/doc/man/binary.html
Переходимо до роботи з кирилицею:
Допустимо у нас є модуль tr з функцією tr з перекладами певних фраз -
tr(<<"en">>, <<"langs">>, <<"native_name">>) -> <<"English">>;
tr(<<"en">>, <<"fruits">>, <<"apple">>) -> <<"Apple">>;
tr(<<"ru">>, <<"langs">>, <<"native_name">>) -> <<"Русский"/utf8>>;
tr(<<"ru">>, <<"fruits">>, <<"apple">>) -> <<"Яблоко"/utf8>>;
tr(<<"uk">>, <<"langs">>, <<"native_name">>) -> <<"Українська"/utf8>>;
tr(<<"uk">>, <<"fruits">>, <<"apple">>) -> <<"Яблуко"/utf8>>;
у даній функції вхідними агументами є код мови та два ключі
(їх може бути більше чи менше в залежності від потреби),
по яких ми дістаємо потрібне нам значення
зверніть увагу - для кирилиці прописуємо utf8
також для кирилиці ми використовуємо функції
unicode:characters_to_binary
unicode:characters_to_list
замість
erlang:list_to_binary
erlang:binary_to_list
крім того, у цих функцій ще можна вказати кодування
(це допомагає коли потрібно перетворити latin1 в utf8)
31> unicode:characters_to_binary("привіт", utf8, utf8).
<<208,191,209,128,208,184,208,178,209,150,209,130>>
що до цього можна додати?
- існує отака бібліотека для роботи зі строками, включаючи utf8-строки:
https://github.com/erlang-unicode/ux - відправляємо кирилицю по вебсокетах в erlang фреймворку n2o - [тут]
Посилання
https://erlang.org/doc/man/string.html
https://erlang.org/doc/man/binary.html
https://github.com/erlang-unicode/ux