Знайомство з 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

Продовження

Посилання

https://erlang.org/doc/man/re.html