Знайомство з n2o v4.4 [8]
Розглянемо способи валідації отриманих даних -
латиниці (latin1) та кирилиці (utf8) в erlang та n2o
раніше ми уже трішки розглядали специфіку роботи з кирилицею в ерлангу
продовжуємо -
допустимо нам потрібно перевірити чи валідна у нас строка
( поки не важливо - спискова строка чи бінарна )
is_valid_string1(A) ->
case re:run(A, "^[0-9A-Za-z_]{2,100}$") of
nomatch ->
false;
_ ->
true
end.
is_valid_string2(A) ->
case re:run(A, <<"^[0-9A-Za-z_]{2,100}$">>) of
nomatch ->
false;
_ ->
true
end.
і ці функції чудово працюють, поки у нас використовується лише латиниця,
поки у нас немає кирилиці чи інших utf8 символів
що нам робити, якщо ми користуємось n2o та хочемо зробити валідацію строки з кирилицею?
розглямо на прикладі
на html сторінці у нас існує
<input type="text" id="mytest">
ми ввели в інпут текст "тест1"
відправимо цей текст на сервер
ws.send(enc(tuple( atom('client'), tuple(atom('myclause'), querySource('mytest')) )));
зловимо на сервері цей текст у відповідному модулі нашої сторінки
event({client,{myclause, Note}}) ->
...
;
якщо ми спробуємо отримане значення (значення змінної Note)
закинути в якусь з функцій вище, котрі ми використовували для валідації латиниці -
ми отримаємо помилку в рантаймі
зверніть увагу - текст "тест1", при використанні n2o,
ми отримаємо на сервері у вигляді [209,130,208,181,209,129,209,130,49] ,
а не [1090,1077,1089,1090,49], як ви могли подумати :)
останній варіант ви можете отримати при вводі в ерланг-консоль нашого значення
і зараз розглянемо валідацію отриманого нами значення
для початку нам потрібно перетворити нашу спискову строку в бінарну,
таким чином щоб не "поламати", не загубити вигляд
Note2 = unicode:characters_to_binary(Note,utf8,latin1),
далі ми уже можемо передати отриману бінарну строку в нашу функцію-валідатор для utf8 строк
is_valid_string3(A) ->
case re:run(A, <<"^[0-9A-Za-zА-Яа-я_]{2,100}$"/utf8>>, [unicode]) of
nomatch ->
false;
_ ->
true
end.
зверніть увагу на /utf8 в регулярному виразі
та на ключ [unicode] третім параметром в re:run