乐趣区

关于python3.x:unicodedata-Unicode-数据库

此模块提供了对 Unicode Character Database (UCD) 的拜访。UCD 中定义了所有 unicode 字符的字符属性。

前情提醒: 测试代码中,右尖括号(>)表示命令行中输出的命令;独自一行并以井字符(#)结尾的为输入构造;库的导入仅在本文的第一个测试代码中展示,其余代码块均省略库的导入代码。

  • 零碎类型: Windows 10
  • python 版本: Python 3.9.0
unicodedata.lookup(name)

通过 unicode 字符的名称来查找 unicode 字符。

参数:
    name: unicode 字符的名称
返回值:
    str,unicode 字符

依据传入的名称,来查找对应的 unicode 字符,如果查找到则返回 unicode 字符,否则会引发 KeyError 谬误。

import unicodedata

print(unicodedata.lookup('Cjk Compatibility Ideograph-2f80f'))
# ????
print(unicodedata.lookup('Armenian Small Ligature Men Now'))
# ﬓ
print(unicodedata.lookup('111'))
# Traceback (most recent call last):
#   File "e:\project\test\test.py", line 3, in <module>
#     print(unicodedata.lookup('111'))
# KeyError: "undefined character name'111'"
unicodedata.name(chr[, default])

获取 unicode 字符的名称。

参数:
    chr: str,字符
    default: str,可选参数,当没有查找到 unicode 字符的名称时的默认返回值
返回值:
    str,unicode 字符的名称或传入的默认值

依据传入的 unicode 字符,来查找对应的名称,如果查找到则返回名称,如果未查找到并且传入了默认值则返回默认值,如果未查找到并且没有传入默认值则会引发 ValueError 谬误。

print(unicodedata.name('a'))
# LATIN SMALL LETTER A
print(unicodedata.name('❋'))
# HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
print(unicodedata.name('✍'))
# WRITING HAND

PS: 不是小编不测试默认值和报错,是基本找不到不是 unicode 字符的字符。????

‘ 毫无用处 ’ 三兄弟?
unicodedata.decimal(chr[, default])
unicodedata.digit(chr[, default])
unicodedata.numeric(chr[, default])

失去示意数字字符的数值

参数:
    chr: str,数字字符
    default: str,可选参数,当没有查找到 unicode 字符的名称时的默认返回值
返回值:
    int,示意数字字符的数值

传入一个数字字符,而后返回一个示意数字字符的数值,如果传入参数不符合要求,那么将引发 ValueError 谬误,当 default 参数有值时则返回 default 参数的值。

print(unicodedata.decimal('3'))
# 3
print(unicodedata.decimal('b', 'Error'))
# Error
print(unicodedata.decimal('b'))
# Traceback (most recent call last):
#   File "e:\project\test\test.py", line 3, in <module>
#     print(unicodedata.decimal('b'))
# ValueError: not a decimal

通过一番测试,小编发现仅仅能传入 '0'~'9'10str 类型的数字,其余的均会报错。也就是说,传入一个 str 类型的数字,返回一个 int 类型的数字,这就要吐槽一下了, 这性能有什么作用吗,int() 函数它不香吗? unicodedata.numeric(chr[, default]) 函数也有殊途同归之妙,也是只能传一个 str 类型的数字,返回一个 int 类型的数字。不了解,真的不了解。

unicodedata.numeric() 函数就比前两个函数更弱小一些,尽管也是传入一个 str 类型的字符,但前两个函数只能只能传 '0'~'9'10str 类型的数字,unicodedata.numeric() 函数能够中文简写数字,中文大写数字,罗马数字,甚至字符数字 (①) 都能够返回对应的后果。

print(unicodedata.numeric('①'))
# 1.0
print(unicodedata.numeric('一'))
# 1.0
print(unicodedata.numeric('壹'))
# 1.0
print(unicodedata.numeric('Ⅰ'))
# 1.0
print(unicodedata.numeric('1'))
# 1.0
分类小分队
unicodedata.category(chr)
unicodedata.bidirectional(chr)
unicodedata.east_asian_width(chr)

unicode 中,有多种分类规范,字符在各个分类规范中都有本人的的分类定位。以上三个函数是查问字符别离在三种分类规范下的分类名称。

参数:
    chr: str,字符
返回值:
    str,分类名称

unicodedata.category(chr) 能够获取指定字符在 惯例分类 中所属的分类名称,unicodedata.bidirectional(chr) 能够获取指定字符的 双向字符类型名称 unicodedata.east_asian_width(chr) 能够获取指定字符的 字符宽度分类 名称。

须要介绍介绍 双向字符类型 字符宽度分类 这两个概念,首先说说 双向字符类型,在 unicode 字符中,大部分字符是从左向右显示的字符,但有些字符是从右向左显示的字符,如阿拉伯语, 希伯来语等,所以 unicode 退出了一个双向算法,最终的后果就是对每个字符又进行了一次双向字符的分类。

再聊聊 字符宽度分类,在 unicode 字符中,字符是有宽度概念的,也就是说字符展现的宽度是不一样的,特地是东亚地区的文字字符。因而 unicode 将所有的宽度都分类进去,并将字符依据宽度分类。east_asian_width() 函数就是获取指定字符的宽度类型,函数名中指明了 east asian (东亚) 可能是只有东亚地区的字符有不同的宽度,为了这个地区的文字能失常应用才退出的这一概念。

高能预警,一大波测试代码袭来:

'''获取字符的惯例分类'''
print(unicodedata.category('①'))  # 符号
# No
print(unicodedata.category('壹'))  # 中文
# Lo
print(unicodedata.category('✔'))  # 符号
# So
'''获取字符的双向字符类型'''
print(unicodedata.bidirectional('ب'))  # 阿拉伯语中的一个字母
# AL
print(unicodedata.bidirectional('①'))
# ON
print(unicodedata.bidirectional('壹'))
# L
print(unicodedata.bidirectional('✔'))
# ON
print(unicodedata.bidirectional('1'))
# EN
'''获取字符的字符宽度分类'''
print(unicodedata.east_asian_width('①'))  # 符号
# A
print(unicodedata.east_asian_width('壹'))  # 中文
# W
print(unicodedata.east_asian_width('あ'))  # 日文
# W
print(unicodedata.east_asian_width('ب'))  # 阿拉伯语中的一个字母
# N
print(unicodedata.east_asian_width('1'))  # 数字
# Na
print(unicodedata.east_asian_width('A'))  # 英文字母
# A

看到测试代码,小伙伴们应该发现了,获取的分类名称都是缩写,这就更加不了解每个分类名称都是什么意思了,小伙伴们能够在 unicode 的文档中查找到相干的阐明,网址曾经列在了下方参考资料中。

unicodedata.combining(chr)

获取指定字符的标准组合值

参数:
    chr: str,字符
返回值:
    int,unicode 字符的标准组合值

返回指定字符的标准组合值,正规操作时,依据这个值由小到大进行排序,如果字符未定义标准组合值,那么将返回 0

print(unicodedata.combining('壹'))
# 0
print(unicodedata.combining('1'))
# 0
print(unicodedata.combining('A'))
# 0
unicodedata.mirrored(chr)

判断指定字符是不是镜像字符

参数:
    chr: str,字符
返回值:
    int,0 或 1

能够了解为指定字符在通常状况下是不是须要成对呈现或与其余字符一起呈现,如 ()。如果是这样的字符,则返回 1,否则返回 0

print(unicodedata.mirrored('口'))
# 0
print(unicodedata.mirrored('1'))
# 0
print(unicodedata.mirrored('A'))
# 0
print(unicodedata.mirrored('/'))
# 0
print(unicodedata.mirrored('('))
# 1
print(unicodedata.mirrored('['))
# 1
print(unicodedata.mirrored('{'))
# 1
print(unicodedata.mirrored('<'))
# 1
print(unicodedata.mirrored('"'))
# 1
print(unicodedata.mirrored("'"))
# 1
unicodedata.decomposition(chr)

获取指定字符的合成映射

参数:
    chr: str,字符
返回值:
    str,相似 16 进制的字符串

获取指定字符的合成映射,如果没有则返回空值

print(unicodedata.decomposition('fi'))
# <compat> 0066 0069
print(unicodedata.decomposition('আ'))
# 
print(unicodedata.decomposition('▇'))
# 
print(unicodedata.decomposition('ㄌ'))
# 
print(unicodedata.decomposition('⠟'))
# 
print(unicodedata.decomposition('????'))
# 
unicodedata.is_normalized(form, unistr)

判断指定字符串是否是正规模式

参数:
    form: str,正规模式,有效值有: NFC、NFKC、NFD、NFKD
    unistr: str,字符串
返回值:
    bool

判断指定字符串是否是正规模式,如果是则返回 True,否则返回 False

print(unicodedata.is_normalized('NFC', 'āáǎàōóǒòēéěè'))
# True
print(unicodedata.is_normalized('NFD', 'āáǎàōóǒòēéěè'))
# False
unicodedata.normalize(form, unistr)

获取指定字符串的指定正规模式

参数:
    form: str,正规模式,有效值有: NFC、NFKC、NFD、NFKD
    unistr: str,字符串
返回值:
    str

将指定字符串转换为指定模式后返回,上面的例子中,先判断指定字符串不是 NFD 模式,而后转换为 NFD 模式,再次判断转化后的字符串是否是 NFD 模式。以此来验证 normalize() 函数。

temp_str = 'āáǎàōóǒòēéěè'
print(unicodedata.is_normalized('NFD', temp_str))  # 字符串不是 NFD 模式
# False
print(unicodedata.is_normalized('NFD', unicodedata.normalize('NFD', temp_str)))  # 将字符串转换为 NFD 而后再判断是否是 NFD 模式
# True
属性两枚

unicodedata.unidata_version 能够查看以后援用的 unicodedata 模块应用的 Unicode 数据库的版本。

unicodedata.ucd_3_2_0 是一个与 unicodedata 模块有雷同办法的对象,然而应用的 Unicode 数据库的版本是 3.2.0,在非凡状况下须要用到。

print(unicodedata.unidata_version)
# 13.0.0
print(unicodedata.ucd_3_2_0.unidata_version)
# 3.2.0
print(unicodedata.ucd_3_2_0.name('a'))
# LATIN SMALL LETTER A

参考资料

官网文档: https://docs.python.org/zh-cn…

unicode 双向字符类型: https://www.unicode.org/repor…

unicode 东亚宽度类型: https://www.unicode.org/repor…

更多内容请关注微信公众号《python 库详解》

退出移动版