如何判断non-language个字符的字符?
How to judge the characters of non-language characters?
我的标题可能被误解了,我描述一下:
- 可以是Chinese/Japanese或任何其他国家的语言,例如
你好
或こんにちは
- 可以是英文字母,
A-Z
或a-z
- 不能是符号,例如
!
或!
、,
或,
- 不能是表情符号或其他符号等特殊字符
可以通过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
比较。
我的标题可能被误解了,我描述一下:
- 可以是Chinese/Japanese或任何其他国家的语言,例如
你好
或こんにちは
- 可以是英文字母,
A-Z
或a-z
- 不能是符号,例如
!
或!
、,
或,
- 不能是表情符号或其他符号等特殊字符
可以通过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
比较。