unicodedata模块

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unicodedata模块相关的知识,希望对你有一定的参考价值。


UCD是Unicode字符数据库(Unicode Character DataBase)的缩写。

UCD由一些描述Unicode字符属性和内部关系的纯文本或html文件组成。

UCD中的文本文件大都是适合于程序分析的Unicode相关数据。其中的html文件解释了数据库的组织,数据的格式和含义。

UCD中最庞大的文件无疑就是描述汉字属性的文件Unihan.txt。

在UCD 5.0,0中,Unihan.txt文件大小有28,221K字节。Unihan.txt中包含了很多有参考价值的索引,例如汉字部首、笔划、拼音、使用频度、四角号码排序等。这些索引都是基于一些比较权威的辞典,但大多数索引只能检索部分汉字。

lookup

语法:unicodedata.lookup(name)

描述:通过一个名称(name)来查找一个字符。如果找到name对应的字符,则返回相应字符;若未找到,则抛出异常KeyError。

import unicodedata
print(unicodedata.lookup('LEFT CURLY BRACKET')) # 左卷曲括号, '{'
print(unicodedata.lookup('LOWER')) 
{



---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-2-f8aa898043e8> in <module>
      1 import unicodedata
      2 print(unicodedata.lookup('LEFT CURLY BRACKET')) # 左卷曲括号, '{'
----> 3 print(unicodedata.lookup('LOWER'))


KeyError: "undefined character name 'LOWER'"

name

语法:unicodedata.name(chr[, default])

描述:通过字符(chr,只能是单个字符)来查找它的名称。若成功则返回相应名称。给定默认值default后,若未找到对应名称时则返回default值;若未给定默认值,且未找到对应名称则抛出异常ValueError。

print(unicodedata.name('^'))
print(unicodedata.name('{'))
print(unicodedata.name('@'))
print(unicodedata.name('\\t', 0)) # 未找到对应名称,返回'0'
print(unicodedata.name('\\t')) # 未找到对应名称,且未指定默认值,所以抛出异常ValueError

CIRCUMFLEX ACCENT
LEFT CURLY BRACKET
COMMERCIAL AT
0



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-9-9ab6ba04cd7b> in <module>
      3 print(unicodedata.name('@'))
      4 print(unicodedata.name('\\t', 0)) # 未找到对应名称,返回'0'
----> 5 print(unicodedata.name('\\t')) # 未找到对应名称,且未指定默认值,所以抛出异常ValueError


ValueError: no such name

decimal

语法:unicodedata.decimal(chr[,default])

描述:将unicode字符(chr)转换为其等效的十进制值。以整数形式返回【该字符对应的十进制值】。若未定义这样的值,则返回默认值default;若未指定默认值,则抛出ValueError异常。

print(unicodedata.decimal('7'))
7
print(unicodedata.decimal('7a'))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-11-0cd5612c103f> in <module>
----> 1 print(unicodedata.decimal('7a'))


TypeError: decimal() argument 1 must be a unicode character, not str
print(unicodedata.decimal('a', 0)) # 未找到,返回默认值0
0

digit

语法:unicodedata.digit(chr[, default])

描述:将unicode字符(chr)转换为其等效的数字值。以整数形式返回【该字符对应的数字值】。若未定义这样的值,则返回默认值default;若未指定默认值,则抛出ValueError异常。

print(unicodedata.digit('9', None))
9
print(unicodedata.digit('9a', None))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-16-ecf1b3b1dce3> in <module>
----> 1 print(unicodedata.digit('9a', None))


TypeError: digit() argument 1 must be a unicode character, not str
print(unicodedata.digit('\\t', 0)) # 未找到,返回默认值0
print(unicodedata.digit('\\t'))  # 未找到,且未指定默认值,所以抛出ValueError异常
0



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-18-21b249bc5ecd> in <module>
      1 print(unicodedata.digit('\\t', 0)) # 未找到,返回默认值0
----> 2 print(unicodedata.digit('\\t'))  # 未找到,且未指定默认值,所以抛出ValueError异常


ValueError: not a digit

numeric

语法:unicodedata.numeric(chr[, default])

描述:将Unicode字符(chr)转换为等效的数值。以浮点形式返回【与chr相对应的数值】。若未定义这样的值,则返回默认值default;若未指定默认值,则抛出ValueError异常。(把一个表示数字的字符转换为浮点数。比如,可将’5’、'五’转换数值输出。与digit()不同是numeric()可以转换任意表示数值的字符,不仅仅限于0到9的字符)

print(unicodedata.numeric('四'))
print(unicodedata.numeric('8', None))
print(unicodedata.numeric('a', 0)) # 'a'不能转换为数字,所以返回默认值0
4.0
8.0
0
print(unicodedata.numeric('8a', None))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-20-b9475494db3c> in <module>
----> 1 print(unicodedata.numeric('8a', None))


TypeError: numeric() argument 1 must be a unicode character, not str

category

语法:unicodedata.category(chr)

描述:返回字符chr在unicode里分类的类型。

具体类型如下:

Code Description

[Cc] Other, Control

[Cf] Other, Format

[Cn] Other, Not Assigned (no characters in the file have this property)

[Co] Other, Private Use

[Cs] Other, Surrogate

[LC] Letter, Cased

[Ll] Letter, Lowercase

[Lm] Letter, Modifier

[Lo] Letter, Other

[Lt] Letter, Titlecase

[Lu] Letter, Uppercase

[Mc] Mark, Spacing Combining

[Me] Mark, Enclosing

[Mn] Mark, Nonspacing

[Nd] Number, Decimal Digit

[Nl] Number, Letter

[No] Number, Other

[Pc] Punctuation, Connector

[Pd] Punctuation, Dash

[Pe] Punctuation, Close

[Pf] Punctuation, Final quote (may behave like Ps or Pe depending on usage)

[Pi] Punctuation, Initial quote (may behave like Ps or Pe depending on usage)

[Po] Punctuation, Other

[Ps] Punctuation, Open

[Sc] Symbol, Currency

[Sk] Symbol, Modifier

[Sm] Symbol, Math

[So] Symbol, Other

[Zl] Separator, Line

[Zp] Separator, Paragraph

[Zs] Separator, Space

print(unicodedata.category('四')) # Letter, Other
print(unicodedata.category('8')) # Number, Decimal Digit
print(unicodedata.category('a'))
Lo
Nd
Ll

combining

语法:unicodedata.combining(chr)

描述:把字符的权威组合值返回,如果没有定义,默认是返回0。当正规化操作时,可以根据这个值进行排序,大的值排在小的值后面。

print(unicodedata.combining('\\t'))
print(unicodedata.combining('A'))
0
0

east_asian_width

语法:unicodedata.east_asian_width(chr)

描述:返回字符显示的宽度。具体内容如下:

F:fullwidth,H:halfwidth,W:wide,Na:narrow,A:ambiguous(不明确),N:natural(正常)

print(unicodedata.east_asian_width('9'))
print(unicodedata.east_asian_width('A'))
print(unicodedata.east_asian_width('蔡'))
Na
Na
W

mirrored

语法:unicodedata.mirrored()

描述:判断字符chr是否支持镜像属性,支持则返回1,不支持则返回0。

print(unicodedata.mirrored('0'))
print(unicodedata.mirrored('蔡'))
0
0

decomposition

语法:unicodedata.decomposition(chr)

描述:将一个可分解的字符chr分成两个16进制的值并返回,如果不可分解,返回空。

print(unicodedata.decomposition('é')) # 可分解
print(unicodedata.decomposition('ガ'))
print(unicodedata.decomposition('e')) # 不可分解,所以返回空值(输出就是一片空白)
0065 0301
30AB 3099

normalize

语法:unicodedata.normalize(form, unistr)

把一串UNICODE字符串转换为普通格式的字符串,form格式支持NFC、NFKC、NFD和NFKD格式。一些文本元素即可以使用静态的预先组合好的形式,也可使用动态组合的形式。Unicode字符的不同表示序列被认为是等价的。如果两个或多个序列被认为是等价的,Unicode标准不规定哪一种特定的序列是正确的,而认为每一个序列只不过与其它序列等价。

如 果需要一种单一的单一的表示方式,可以使用一种规范化的Unicode文本形式来减少不想要区别。Unicode标准定义了四种规范化形式: Normalization Form D (NFD),Normalization Form KD (NFKD),Normalization Form C (NFC),和Normalization Form KC (NFKC)。大约来说,NFD和NFKD将可能的字符进行分解,而NFC和NFKC将可能的字符进行组合。

s1 = 'café' # 'é'为组合字符,由'e'与重音符组合而成
s2 = 'cafe\\u0301' # 将'é'拆为'e'和'\\u0301','\\u0301'为重音符的unicode编码

print(unicodedata.normalize('NFC', s1)) # NFC使用最少的码位,所以'é'被合并为一个字符(事实上s1中本来就是é),因而返回结果为'café'(输出不带引号)
print(unicodedata.normalize('NFC', s2)) # 'e'和'\\u0301'被合并为一个字符é,因而返回结果为'café'(输出不带引号)
print(unicodedata.normalize('NFD', s1)) # NFD使组合字符拆开为两个字符,这里'é'被拆为'e'和重音符,即输出结果为:'cafeˋ'
print(unicodedata.normalize('NFD', s2)) # s2最后两个字符为'e'和'\\u0301',

café
café
café
café
print(unicodedata.normalize('NFKD', u'aあä').encode('ascii', 'ignore'))
b'aa'
title = u"Klüft skräms inför på fédéral électoral große"
print (title.encode("ascii",'ignore')) #可以看到丢了许多的字符
b'Klft skrms infr p fdral lectoral groe'
unicodedata.normalize('NFKD', title).encode('ascii','ignore') # 进行分解
b'Kluft skrams infor pa federal electoral groe'

参考

unicodedata — Unicode Database

https://blog.csdn.net/qq_40061206/article/details/105481909

以上是关于unicodedata模块的主要内容,如果未能解决你的问题,请参考以下文章

python unicodedata用法

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

unicodedata.normalize ——Unicode文本标准化

如何有条件地将 C 代码片段编译到我的 Perl 模块?

罗列Python标准模块

CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段