如何检查字形是否是一封信?

Cra*_*Man 4 unicode elixir internationalization

我如何检查字形是否是一个字母(或者通常用于文字的东西,如象形文字)?

通过药剂的寻找后,String文档我看到的唯一方法是检查是否String.downcaseString.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)

Pat*_*ity 8

您可以使用正则表达式来检查某些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.