6.5. unicodedata - Unicode数据库

此模块提供对Unicode字符数据库(UCD)的访问,该字符数据库定义所有Unicode字符的字符属性。此数据库中包含的数据是从UCD版本8.0.0编译的。

该模块使用与Unicode标准附录#44,“Unicode字符数据库”定义的名称和符号相同的名称和符号。它定义了以下功能:

unicodedata.lookup(name)

通过一个名称来查找字符。如果找到具有给定名称的字符,则返回相应的字符。如果未找到,则会引发KeyError

在版本3.3中新增:支持名称别名[1]和命名序列[2]

unicodedata.name(chr[, default])

返回分配给字符chr的名称作为字符串。按字符来查找它的名称。如果未定义名称,则返回默认,如果未指定,则会引发ValueError

unicodedata.decimal(chr[, default])

将分配给字符chr的十进制值作为整数返回。如果没有定义这样的值,则返回默认,或者如果没有给出,则引发ValueError

unicodedata.digit(chr[, default])

将分配给字符chr的数字值作为整数返回。如果没有定义这样的值,则返回默认,或者如果没有给出,则引发ValueError

unicodedata.numeric(chr[, default])

返回分配给字符chr的数值为float。如果没有定义这样的值,则返回默认,或者如果没有给出,则引发ValueError

unicodedata.category(chr)

将分配给字符chr的一般类别返回为字符串。

unicodedata.bidirectional(chr)

以字符串形式返回分配给字符chr的双向类。如果没有定义这样的值,则返回一个空字符串。

unicodedata.combining(chr)

返回分配给字符chr的规范组合类作为整数。如果未定义组合类,则返回0

unicodedata.east_asian_width(chr)

将分配给字符chr的东亚宽度返回为字符串。

unicodedata.mirrored(chr)

将分配给字符chr的镜像属性返回为整数。如果字符在双向文本中被识别为“镜像”字符,则返回1,否则返回0

unicodedata.decomposition(chr)

以字符串形式返回分配给字符chr的字符分解映射。如果未定义此类映射,则返回空字符串。

unicodedata.normalize(form, unistr)

返回Unicode字符串unistr的正常形式形式形式的有效值为“NFC”,“NFKC”,“NFD”和“NFKD”。

Unicode标准基于规范等价和兼容性等价的定义来定义Unicode字符串的各种规范化形式。在Unicode中,可以以各种方式表示几个字符。例如,字符U + 00C7(LATIN CAPITAL LETTER C WITH CEDILLA)也可以表示为序列U + 0043(拉丁资本信函C)U + 0327(组合CEDILLA)。

对于每个字符,有两种正常形式:正常形式C和正常形式D.正常形式D(NFD)也称为规范分解,并且将每个字符转换为其分解形式。正常形式C(NFC)首先应用规范分解,然后再次组合预组合字符。

除了这两种形式,还有两种基于兼容性等价的附加正常形式。在Unicode中,支持某些字符,通常与其他字符统一。例如,U + 2160(ROMAN NUMERAL ONE)与U + 0049(LATIN CAPITAL LETTER I)真的是一样的东西。但是,它支持Unicode,以兼容现有的字符集(例如。gb2312)。

正态KD(NFKD)将应用兼容性分解,即用其等同替换所有兼容性字符。正常形式KC(NFKC)首先应用兼容性分解,随后是规范组合。

即使两个unicode字符串被归一化,并且对人类读者看起来相同,如果一个具有组合字符,另一个不是,它们可能不会相等。

此外,模块还会显示以下常量:

unicodedata.unidata_version

此模块中使用的Unicode数据库的版本。

unicodedata.ucd_3_2_0

这是一个与整个模块具有相同方法的对象,但对于需要此特定版本的Unicode数据库(例如IDNA)的应用程序,则使用Unicode数据库版本3.2。

例子:

>>> import unicodedata
>>> unicodedata.lookup('LEFT CURLY BRACKET')
'{'
>>> unicodedata.name('/')
'SOLIDUS'
>>> unicodedata.decimal('9')
9
>>> unicodedata.decimal('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: not a decimal
>>> unicodedata.category('A')  # 'L'etter, 'u'ppercase
'Lu'
>>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber
'AN'

脚注

[1]http://www.unicode.org/Public/8.0.0/ucd/NameAliases.txt
[2]http://www.unicode.org/Public/8.0.0/ucd/NamedSequences.txt