unicodedata
--- Unicode 数据库¶
此模块提供对 Unicode 字符数据库 (UCD) 的访问,该数据库定义了所有 Unicode 字符的字符属性。 此数据库中包含的数据是从 UCD 版本 15.0.0 编译的。
该模块使用与 Unicode 标准附件 #44,“Unicode 字符数据库” 中定义的相同名称和符号。 它定义了以下函数:
- unicodedata.name(chr[, default])¶
以字符串形式返回分配给字符 chr 的名称。 如果未定义名称,则返回 default,如果未给出,则引发
ValueError
。
- unicodedata.decimal(chr[, default])¶
以整数形式返回分配给字符 chr 的十进制值。 如果未定义此类值,则返回 default,如果未给出,则引发
ValueError
。
- unicodedata.digit(chr[, default])¶
以整数形式返回分配给字符 chr 的数字值。 如果未定义此类值,则返回 default,如果未给出,则引发
ValueError
。
- unicodedata.numeric(chr[, default])¶
以浮点数形式返回分配给字符 chr 的数值。 如果未定义此类值,则返回 default,如果未给出,则引发
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(带 cedilla 的拉丁文大写字母 C)也可以表示为序列 U+0043(拉丁文大写字母 C)U+0327(组合 cedilla)。
对于每个字符,有两种规范形式:规范形式 C 和规范形式 D。规范形式 D (NFD) 也称为规范分解,它将每个字符转换为其分解形式。 规范形式 C (NFC) 首先应用规范分解,然后再次组合预组合字符。
除了这两种形式之外,还有两种基于兼容性等效的附加标准形式。在 Unicode 中,支持某些通常会与其他字符统一的字符。例如,U+2160(罗马数字一)实际上与 U+0049(拉丁大写字母 I)相同。但是,为了与现有的字符集(例如 gb2312)兼容,Unicode 中支持它。
标准形式 KD (NFKD) 将应用兼容性分解,即将所有兼容性字符替换为其等效字符。标准形式 KC (NFKC) 首先应用兼容性分解,然后进行规范组合。
即使两个 Unicode 字符串经过规范化并且对人类读者来说看起来相同,但如果一个字符串包含组合字符而另一个字符串不包含,则它们可能不相等。
- unicodedata.is_normalized(form, unistr)¶
如果 Unicode 字符串 *unistr* 采用标准形式 *form*,则返回 True。*form* 的有效值为“NFC”、“NFKC”、“NFD”和“NFKD”。
3.8 版新增。
此外,该模块还公开了以下常量
- unicodedata.unidata_version¶
此模块中使用的 Unicode 数据库版本。
- unicodedata.ucd_3_2_0¶
这是一个与整个模块具有相同方法的对象,但使用 Unicode 数据库版本 3.2,适用于需要此特定版本的 Unicode 数据库的应用程序(例如 IDNA)。
示例
>>> 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 <module>
ValueError: not a decimal
>>> unicodedata.category('A') # 'L'etter, 'u'ppercase
'Lu'
>>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber
'AN'
脚注