Проверка длины нескольких языков - PullRequest
0 голосов
/ 18 октября 2018

Я работаю над многоязычным приложением, которое позволяет пользователю вводить несколько языков (например, английский, китайский и корейский).

. Для регистрации пользователя у меня есть функция validate_length для проверки длины имени и имени.фамилия пользователя.

Однако проблема в том, что я не хочу получать одинаковые результаты для подсчета букв английского и китайского алфавита.Например, если я считаю длину для «Дэвида» и «器 防雷 器 防».Они оба возвращают 5, хотя китайские иероглифы занимают гораздо больше места.

В настоящее время Ecto поддерживает подсчет длины на codepoints и graphemes, но любой из них делает то, что мне нужно.

Как я могу это сделать?Можно ли даже посчитать букву и проверить, сколько «байт» требуется?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете использовать Kernel.byte_size/1:

iex(13)> byte_size("David")
5
iex(14)> byte_size("器防雷器防")
15
0 голосов
/ 18 октября 2018

Одна вещь, которую вы можете сделать, это использовать регулярное выражение для сопоставления символов Han и Hangul и назначить им большую длину:

> s = "David 器防雷器防 한글"
> r = ~r/\p{Han}|\p{Hangul}/u
> Enum.sum(for <<c::utf8 <- s>> do
     case Regex.match?(r, <<c::utf8>>) do
       true -> 2
       false -> 1
     end
   end)
21

При этом используются свойства символов Unicode, как описано в re документация .Обратите внимание на конечный u в регулярном выражении ~r/\p{Han}|\p{Hangul}/u: он активирует режим Unicode, который необходим для работы.

...