Why is `'?'.isnumeric()` false?
根据官方的Unicode联合体代码表,所有这些都是数字:
1 2 3 4 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ ? ? ? ? ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
但是,当我让python告诉我哪些是数字时,它们都是(甚至是
1 2 | In [252]: print([k for k in"????????????????ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ????ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ??????????????????" if not k.isnumeric()]) ['?', '?', '?', '?'] |
那些是:
- ?罗马数字横翻一百
- ?拉丁文小写字母横翻C
- ?倒数第二位
- ?倒转数字三
为什么python认为这些不是数字?
为"具有单一代码数值属性的所有特征"文件。
The canonical reference for that property is the unicode character database.The information we need can be dug out of http://www.unicode.org/public/9.0.0/ucd/unicodedata.txt,which is the latest version at time of writing(late 2016)(warning:1.5mb text file).这是一个小小的作弊(文献资料载于UAX 3544)。我要把它的入口展示给一个字符,它是第一个,U+3023杭州数字三(E=12323;)
1 | 3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; |
第八个半导体分离场是"数值"属性;在此情况下,数值为3,由字符名称组成。"Python"是真的,如果这片土地不是真的。可直接使用
第三个半导体分离场是一个两个特征代码,给出"一般类别";在此情况下,"NL"。最重要但并非所有的,以数值表示的字符串在一个类别中(类别代码的第一封信是N)。The exceptions are all Hanzi that,depending on context,may or may not signify a number;see UAX 355;38.
现在,你的性格在问:
ZZU1
这些字符不具有指定的数值,所以Python的行为是正确的——作为文件。
注:per https://docs.python.org/3.6/whatsnew/3.6.html,python will only be updated to UNICODE 9.0.0 in the 3.6 release;however,afaict these characters have not changed in quite some time.
("为什么这些字符没有数值?"这是一个问题,只有统一代码财团才能明确答案;如果你感兴趣,我建议把它放到他们的邮件列表上。)