python - 为什么 `' ↊'.isnumeric()` 是假的?

标签 python unicode

根据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/

相关文章:

javascript - 在 Django 中发送字符串元素列表

c - 获取要从字符串中打印的符号数

python - 在 Python 中,有效地确定两个列表是否是彼此的移位副本

python - 如何使用 pandas 记录跨列是否发生特定更改?

python - 使用 ffmpeg-python 为视频添加多个字幕

android - 如何从 json 读取\uxxxx

java - Java 中的 "surrogate pair"是什么?

unicode - 在 Windows XP 中搜索 unicode 文本

带套接字的 Python Tic Tac Toe - 套接字问题

python - 极地立体图