验证多种语言的长度
Validating length of multiple languages
我正在开发一个多语言应用程序,它允许用户输入多种语言(例如,英语、中文和韩语)
对于注册用户,我有 validate_length
功能来验证用户名字和姓氏的长度。
但是,我遇到的问题是我不希望计算英文字母和中文字母的结果相同。例如,如果我计算 "David" 和“器防雷器防”的长度。他们都 return 5 尽管汉字占用了更多的空间。
Ecto 目前支持按 codepoints
和 graphemes
计算长度,但它们中的任何一个都能满足我的需要。
我该怎么做?甚至可以计算字母并根据需要多少 "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
我正在开发一个多语言应用程序,它允许用户输入多种语言(例如,英语、中文和韩语)
对于注册用户,我有 validate_length
功能来验证用户名字和姓氏的长度。
但是,我遇到的问题是我不希望计算英文字母和中文字母的结果相同。例如,如果我计算 "David" 和“器防雷器防”的长度。他们都 return 5 尽管汉字占用了更多的空间。
Ecto 目前支持按 codepoints
和 graphemes
计算长度,但它们中的任何一个都能满足我的需要。
我该怎么做?甚至可以计算字母并根据需要多少 "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