验证多种语言的长度

Validating length of multiple languages

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

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

但是,我遇到的问题是我不希望计算英文字母和中文字母的结果相同。例如,如果我计算 "David" 和“器防雷器防”的长度。他们都 return 5 尽管汉字占用了更多的空间。

Ecto 目前支持按 codepointsgraphemes 计算长度,但它们中的任何一个都能满足我的需要。

我该怎么做?甚至可以计算字母并根据需要多少 "bytes" 进行验证?

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

> 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 中所述。请注意正则表达式 ~r/\p{Han}|\p{Hangul}/u 中的尾随 u:它激活 Unicode 模式,这是工作所必需的。

您可以使用 Kernel.byte_size/1:

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