# 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的form规范形式。form的有效值有“NFC”、“NFKC”、“NFD”和“NFKD”。

  Unicode标准基于标准性等价和兼容性等价的定义来定义Unicode字符串的各种规范化形式。在Unicode中，有几个字符可以用多种方式表示。例如，字符U+00C7（带有下变音符的大写拉丁字母C）也可以表示为序列U+0043（大写拉丁字母C）U+0327（和下变音符）。

  对于每个字符，有两种规范形式：规范形式C和规范形式D。规范形式D（NFD）也称为标准性分解，将每个字符转换为其分解形式。规范形式C（NFC）首先应用标准性分解，然后再次组合可以组合的字符。

  除了这两种形式，还有两种额外的规范形式，基于兼容性等价。在Unicode中，支持某些字符，通常与其他字符统一。例如，U+2160（罗马数字1）与U+0049（拉丁大写字母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