Elixir 验证多种语言的长度

Elixir 验证多种语言的长度,elixir,ecto,changeset,Elixir,Ecto,Changeset,我正在开发一个多语言应用程序,它允许用户输入多种语言(例如,英语、汉语和韩语) 对于注册用户,我有validate_length函数来验证用户名和姓氏的长度 然而,我的问题是,我不希望计算英文字母和中文字母的结果相同。例如,如果我计算“David”和“David”的长度器防雷器防". 尽管汉字占用更多的空间,但它们都返回5 目前,Ecto支持通过码点和字集计算长度,但这两种方法都可以满足我的需要 我如何做到这一点?甚至可以计算字母的数量并通过需要多少“字节”进行验证吗?您可以做的一件事是使用正则

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

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

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

目前,Ecto支持通过
码点
字集
计算长度,但这两种方法都可以满足我的需要


我如何做到这一点?甚至可以计算字母的数量并通过需要多少“字节”进行验证吗?

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

> 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
>s=“大卫器防雷器防 한글"
>r=~r/\p{Han}|\p{Hangul}/u
>枚举和(对于2
错误->1
结束
(完)
21

这使用Unicode字符属性,如中所述。请注意正则表达式
~r/\p{Han}\p{Hangul}/u
中的尾随
u
:它激活Unicode模式,这是工作所必需的。

您可以做的一件事是使用正则表达式匹配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
>s=“大卫器防雷器防 한글"
>r=~r/\p{Han}|\p{Hangul}/u
>枚举和(对于2
错误->1
结束
(完)
21
这使用Unicode字符属性,如中所述。请注意正则表达式
~r/\p{Han}\p{Hangul}/u
中的尾随
u
:它激活Unicode模式,这是该模式工作所必需的。

您可以使用:

您可以使用:


“空格”是指字节数还是视觉大小?我指的是视觉大小。但由于示例中的汉字比英文字符多10个字节,我想使用字节就可以了。如果你是指中文在视觉上更宽,那么这都是关于字体度量的,与长生不老药无关。按“空格”“你是说字节数吗?还是视觉尺寸?我是说视觉尺寸。但由于示例中的汉字比英文字符多10个字节,我想使用字节就可以了。如果你的意思是说中文在视觉上更宽,那么这都是关于字体度量的,与Elixir无关。