如何判断non-language个字符的字符?

How to judge the characters of non-language characters?

我的标题可能被误解了,我描述一下:

可以通过elixir的二进制字节数判断,还是通过Unicode判断?

如果我很好地理解你的问题,你想检查给定的字符串是否包含 Chinese/Japanese 个字符或字母字符。但不是标点符号或表情符号?

对于亚洲字符,您可以使用 CJK range from Unicode, which might close enough. You can always check more ranges 表示您想要(禁止)允许的语言。

所以第一步是检查给定的代码点是否在 CJK range(s):

  def is_in_range?(cp) do
    ranges = [
      {"\u4E00", "\u9FEF"},
      {"\u3400", "\u4DBF"},
      {"\u20000", "\u2A6DF"},
      {"\u2A700", "\u2B73F"},
      {"\u2B740", "\u2B81F"},
      {"\u2B820", "\u2CEAF"},
      {"\u2CEB0", "\u2EBEF"},
      {"\u3007", "\u3007"}
    ]

    # Check if the codepoint is any of the ranges above.
    ranges
    |> Enum.map(fn {s, e} ->
      cp >= s and cp <= e
    end)
    |> Enum.any?()
  end

如果我们有那个函数,我们可以检查任何给定的字符串是否包含以下任何字符:

  def contains_cjk(str) do
    str |> String.codepoints() |> Enum.map(&is_in_range?/1) |> Enum.any?()
  end

如果您想比较字母字符,您可以使用常规正则表达式,或者只添加 A-Z 和 a-z 的范围(\u0061\u007A,以及 \u0041\u005A).例如,您的第二个字符串 (こんにちは) 它的第一个代码点在 "Hiragana" 代码块中。您可以添加范围(\u3040\u309F)以也允许这些字符。可以找到块列表 here

此处有关于性能的注释。此代码不是线性的,至于 n 个字符,它将进行 #amount_of_chars_in_range 比较。