验证多种语言的长度

时间:2018-10-18 07:07:29

标签: elixir ecto changeset

我正在开发一种多语言应用程序,该应用程序允许用户输入多种语言(例如,英语,中文和韩语)

对于注册用户,我具有validate_length函数来验证用户的名字和姓氏的长度。

但是,我的问题是我不希望在计算英文字母和中文字母时得到相同的结果。例如,如果我计算“ David”和“器防雷器防”的长度。即使汉字占用更多的空格,它们都返回5。

Ecto当前支持按codepointsgraphemes进行长度计数,但是它们中的任何一个都能满足我的需求。

我该怎么做?甚至可以计算字母并验证它需要多少“字节”?

2 个答案:

答案 0 :(得分:3)

您可以使用Kernel.byte_size/1

iex(13)> byte_size("David")
5
iex(14)> byte_size("器防雷器防")
15

答案 1 :(得分:0)

您可以做的一件事是使用正则表达式匹配汉字和韩文字符,并为其分配更大的长度:

> 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字符属性,如the re documentation中所述。请注意,正则表达式u中的结尾~r/\p{Han}|\p{Hangul}/u:它将激活Unicode模式,这是工作所需的。