Cra*_*Man 4 unicode elixir internationalization
我如何检查字形是否是一个字母(或者通常用于文字的东西,如象形文字)?
通过药剂的寻找后,String文档我看到的唯一方法是检查是否String.downcase和String.upcase返回相同的字符串.如果他们这样做,那么字形不是用在文字中的东西.
我就是这样做的,但肯定应该有一个更简单的方法吗?
defmodule Words do
defp all_letters_uppercase?(string) do
String.upcase(string) == string
end
defp all_letters_downcase?(string) do
String.downcase(string) == string
end
defp contains_letter?(string) do
not (all_letters_uppercase?(string) and all_letters_downcase?(string))
end
def single_grapheme?(string) do
with graphemes = String.graphemes(string)
do
length(graphemes) == 1 and hd(graphemes) == string
end
end
@doc """
Check whether string is a single letter.
"""
def letter?(string) do
single_grapheme?(string) and contains_letter?(string)
end
end
Run Code Online (Sandbox Code Playgroud)
更新:我的代码不适用于日文字母
iex(35)> Words.letter?("?")
false
Run Code Online (Sandbox Code Playgroud)
您可以使用正则表达式来检查某些unicode功能,其中一个是\p{Letter}或\p{L}简称.您可能希望添加一个\p{Mark}*,或者\p{M}*也可以匹配多个以下组合变音符号.这将与发现的逻辑非常匹配String.graphemes/1.请务必u在正则表达式后添加修饰符以启用这些Unicode功能.例如:
iex> String.match?("?", ~r/\A\p{L}\p{M}*\z/u)
true
Run Code Online (Sandbox Code Playgroud)
另请参阅http://erlang.org/doc/man/re.html,"Unicode字符属性"部分和http://www.regular-expressions.info/unicode.html#grapheme.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |