根据Official Unicode Consortium code chart ,所有这些都是数字:
⅐ ⅑ ⅒ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟
Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ
ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ
ↀ ↁ ↂ Ↄ ↄ ↅ ↆ ↇ ↈ ↉ ↊ ↋
但是,当我要求 Python 告诉我哪些是数字时,除了四个之外,它们都是(甚至 ⅟
):
In [252]: print([k for k in "⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉↊↋" if not k.isnumeric()])
['Ↄ', 'ↄ', '↊', '↋']
它们是:
- Ↄ 罗马数字倒百
- ↄ 拉丁文小写字母倒转 C
- ↊ 转为二位
- ↋ 转数字三
为什么 Python 认为这些不是数字?
最佳答案
str.isnumeric
记录为“所有具有 Unicode 数值属性的字符”。
该属性的规范引用是 Unicode Character Database .我们需要的信息可以从http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt中挖掘出来,这是撰写本文时的最新版本(2016 年底)(警告:1.5MB 文本文件)。阅读起来有点棘手(文档在 UAX#44 中)。我将首先显示一个 数字字符的条目,U+3023 HANGZHOU NUMERAL THREE (〣)
3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;;
第八个分号分隔的字段是“数值”属性;在本例中,它的值为 3,与角色的名字一致。当且仅当此字段为非空时,Python 的 str.isnumeric
才为真。可以直接用unicodedata.numeric
查询.
第三个 以分号分隔的字段是一个双字符代码,给出“general category”;在这种情况下,“Nl”。大多数(但不是全部)具有数值的字符属于“数字”类别之一(类别代码的第一个字母是 N)。异常(exception)的是所有汉字,根据上下文,它们可能表示也可能不表示数字;见UAX#38 .
现在,您要问的字符:
2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L ;;;;;N;;; ;2184;
2184;LATIN SMALL LETTER REVERSED C ;Ll;0;L ;;;;;N;;;2183; ;2183
218A;TURNED DIGIT TWO ;So;0;ON;;;;;N;;; ; ;
218B;TURNED DIGIT THREE ;So;0;ON;;;;;N;;; ; ;
这些字符没有分配有数值,因此 Python 的行为是正确的,正如记录的那样。
注意:根据 https://docs.python.org/3.6/whatsnew/3.6.html , Python在3.6版本中只会更新到Unicode 9.0.0;然而,据我所知,这些字符在很长一段时间内都没有改变。
(“为什么这些字符没有数值?”是一个只有 Unicode 联盟才能明确回答的问题;如果您有兴趣,我建议您在他们的一个 mailing lists 上提出这个问题。)
关于python - 为什么 `' ↊'.isnumeric()` 是假的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40156585/