1

我刚刚从IANA解析数据时发现了这种奇怪的行为。

"ǃ".isalpha() # returns True
"!".isalpha() # returns False

显然,这两个感叹号是不同的:

In [62]: hex(ord("ǃ"))                                                          
Out[62]: '0x1c3'

In [63]: hex(ord("!"))                                                          
Out[63]: '0x21'

只是想知道有没有办法防止这种情况发生?这种行为的根源是什么?

4

2 回答 2

1

检查Unicode 数据库中的字符。类似感叹号的 ǃ( \u1c3) 是一个字母:

import unicodedata
for c in "!ǃ":
    print(c,'{:04x}'.format(ord(c)),unicodedata.category(c), unicodedata.name(c))
! 0021 Po EXCLAMATION MARK
ǃ 01c3 Lo LATIN LETTER RETROFLEX CLICK
于 2021-06-24T10:01:26.163 回答
0

来自文档:

str.isalpha()

如果字符串中的所有字符都是字母并且至少有一个字符,则返回 True,否则返回 False。 字母字符是在Unicode 字符数据库中定义为“字母”的字符,即一般类别属性为“Lm”、“Lt”、“Lu”、“Ll”或“Lo”之一的字符。请注意,这与 Unicode 标准中定义的“Alphabetic”属性不同。

这意味着您使用的 utf 字符在 utf 数据库中定义为字母。

>>> ord("ǃ")
   451

查看Wikipedia List of UTF characters,该字符ǃ属于拉丁扩展 B,这就是isalpha返回的原因True

于 2021-06-24T08:41:14.377 回答