用于处理Unicode数据的类和函数。

unicodeutil的Python项目详细描述


用于处理Unicode®数据的Python类和函数。它最初是用Python2构建的,但也用Python3、PyPy和PyPy3进行了测试。

依赖关系

此包具有以下外部依赖项:

  • six-对于python 2到3的兼容性

箱子折叠功能

casefold(s)是根据Unicode® Standard的3.13节执行大小写折叠的函数。另请参见W3C page on case folding以获取有关什么是case folding的更多信息。

python 3.3及更新版本已经内置了str.casefold()。这是我尝试构建一个case folding函数,以便与python 2一起使用,因此最初只在python2.7.14中进行了测试。它实质上是解析Unicode® Character Database中包含的CaseFolding.txt文件,以构建字典,然后将其用作查找表,以创建输入字符串的副本,该副本已被转换为便于无案例比较。

更多关于我如何把这些放在我的blog上的信息。

默认情况下,casefold(s)函数执行全大小写折叠。要使用简单的大小写折叠,请传递参数fullcasefold=False(默认值为fullcasefold=True)。请参阅CaseFolding.txt中的注释,以解释简单折叠和全大小写折叠之间的区别。

默认情况下,casefold(s)函数将不使用带点和无点“i”的突厥文特殊大小写映射。要使用突厥语映射,请将参数useturkicmapping=True传递给函数。有关虚线与无点“i”的详细信息,请参见以下网页:

示例用法

使用python 2:

>>> from unicodeutil import casefold
>>> s1 = u"weiß"
>>> s2 = u"WEISS"
>>> casefold(s1) == casefold(s2)
True
>>> s1 = u"LİMANI"
>>> s2 = u"limanı"
>>> casefold(s1) == casefold(s2)
False
>>> casefold(s1, useturkicmapping=True) == casefold(s2, useturkicmapping=True)
True

将Python2字符串拆分为字符,保留代理项对

函数preservesurrogates(s)将把字符串拆分为一个字符列表,保留surrogate pairs

示例用法

使用python 2:

>>> from unicodeutil import preservesurrogates
>>> s = u"ABC\U0001e900DeF\U000118a0gHıİ"
>>> list(s)
[u'A', u'B', u'C', u'\ud83a', u'\udd00', u'D', u'e', u'F', u'\ud806', u'\udca0', u'g', u'H', u'\u0131', u'\u0130']
>>> for c in s:
...     print c
...
A
B
C
???
???
D
e
F
???
???
g
H
ı
İ
>>> list(preservesurrogates(s))
[u'A', u'B', u'C', u'\U0001e900', u'D', u'e', u'F', u'\U000118a0', u'g', u'H', u'\u0131', u'\u0130']
>>> for c in preservesurrogates(s):
...     print(c)
...
A
B
C
?
D
e
F
?
g
H
ı
İ

使用最新的Unicode®字符数据库(UCD)

从python 2.7.15开始,unicodedata模块仍在使用ucd版本5.2.0中的数据。UCD是currently up to version 12.0.0

UnicodeCharacternamedtuple封装了与每个unicode®字符相关联的各种属性,如Unicode Standard Annex #44, UnicodeData.txt中所述。

UnicodeData类表示从unicode联盟ftp站点上找到的latest UnicodeData.txt解析的ucd内容。一旦创建了UnicodeData类的实例,就可以使用unicode标量值进行dict样式的查找,使用lookup_by_char(c)方法通过unicode字符进行查找,或者使用lookup_by_name(name)lookup_by_partial_name(partial_name)方法通过名称进行查找。名称查找在进行查找时使用UAX44-LM2松散匹配规则。也可以通过items()keys()values()方法遍历所有数据。

UnicodeBlocks类封装与unicode字符相关联的块信息。一旦创建了UnicodeBlocks类的实例,就可以通过使用unicode标量值进行dict样式的查找或使用lookup_by_char(c)方法按unicode字符查找来获取与特定unicode字符关联的块名。也可以通过items()keys()values()方法遍历所有数据。

示例用法

使用python 2:

>>> from unicodeutil import UnicodeBlocks, UnicodeData
>>> ucd = UnicodeData()
>>> ucd[0x00df]
UnicodeCharacter(code=u'U+00DF', name='LATIN SMALL LETTER SHARP S', category='Ll', combining=0, bidi='L', decomposition='', decimal='', digit='', numeric='', mirrored='N', unicode_1_name='', iso_comment='', uppercase='', lowercase='', titlecase='')
>>> ucd[0x0130].name
'LATIN CAPITAL LETTER I WITH DOT ABOVE'
>>> ucd.lookup_by_char(u"ᜊ")
UnicodeCharacter(code=u'U+170A', name=u'TAGALOG LETTER BA', category=u'Lo', combining=0, bidi=u'L', decomposition=u'', decimal=u'', digit=u'', numeric=u'', mirrored=u'N', unicode_1_name=u'', iso_comment=u'', uppercase=u'', lowercase=u'', titlecase=u'')
>>> ucd.lookup_by_name("latin small letter sharp_s")
UnicodeCharacter(code=u'U+00DF', name='LATIN SMALL LETTER SHARP S', category='Ll', combining=0, bidi='L', decomposition='', decimal='', digit='', numeric='', mirrored='N', unicode_1_name='', iso_comment='', uppercase='', lowercase='', titlecase='')
>>> blocks = UnicodeBlocks()
>>> blocks[0x00DF]
u'Latin-1 Supplement'
>>> blocks.lookup_by_char(u"ẞ")
u'Latin Extended Additional'

合成和分解朝鲜文音节

函数compose_hangul_syllable(jamo)接受jamo的一个元组或unicode标量值列表,并返回其等效的预合成朝鲜文音节。互补函数decompose_hangul_syllable(hangul_syllable, fully_decompose=False)接受朝鲜文音节的Unicode标量值,并对朝鲜文音节执行规范分解(默认情况下,完全分解=false)或完全规范分解(完全分解=true)。返回值将是Unicode标量值的元组,对应于朝鲜文音节已分解成的Jamo。例如(tak来自Unicode Standard, ch. 03, section 3.12, Conjoing Jamo Behavior的en:

U+D4DB <-> <U+D4CC, U+11B6>  # Canonical Decomposition (default)
U+D4CC <-> <U+1111, U+1171>
U+D4DB <-> <U+1111, U+1171, U+11B6>  # Full Canonical Decomposition

示例用法:

以下示例代码片段:

import sys

from unicodeutil import UnicodeData, compose_hangul_syllable, \
                        decompose_hangul_syllable

ucd = None


def pprint_composed(jamo):
    hangul = compose_hangul_syllable(jamo)
    hangul_data = ucd[hangul]
    print("<{0}> -> {1}".format(
        ", ".join([" ".join([jamo_data.code, jamo_data.name])
                   for jamo_data in [ucd[j] for j in jamo]]),
        " ".join([hangul_data.code, hangul_data.name])
    ))


def pprint_decomposed(hangul, decomposition):
    hangul_data = ucd[hangul]
    print("{0} -> <{1}>".format(
        " ".join([hangul_data.code, hangul_data.name]),
        ", ".join([" ".join([jamo_data.code, jamo_data.name])
                   for jamo_data in [ucd[jamo]
                                     for jamo in decomposition if jamo]])
    ))


def main():
    if len(sys.argv) not in {2, 3, 4}:
        print("Invalid number of arguments!")
        sys.exit(1)
    global ucd
    ucd = UnicodeData()
    if len(sys.argv) == 2:
        hangul = int(sys.argv[1], 16)
        print("Canonical Decomposition:")
        pprint_decomposed(hangul,
                          decompose_hangul_syllable(hangul,
                                                    fully_decompose=False))
        print("Full Canonical Decomposition:")
        pprint_decomposed(hangul,
                          decompose_hangul_syllable(hangul,
                                                    fully_decompose=True))
    elif len(sys.argv) in {3, 4}:
        print("Composition:")
        pprint_composed(tuple([int(arg, 16) for arg in sys.argv[1:]]))


if __name__ == "__main__":
    main()

将生成以下内容(在Python2和Python3中测试):

$ python pprint_hangul.py 0xD4DB
Canonical Decomposition:
U+D4DB HANGUL SYLLABLE PWILH -> <U+D4CC HANGUL SYLLABLE PWI, U+11B6 HANGUL JONGSEONG RIEUL-HIEUH>
Full Canonical Decomposition:
U+D4DB HANGUL SYLLABLE PWILH -> <U+1111 HANGUL CHOSEONG PHIEUPH, U+1171 HANGUL JUNGSEONG WI, U+11B6 HANGUL JONGSEONG RIEUL-HIEUH>
$ python3 pprint_hangul.py 0xD4CC 0x11B6
Composition:
<U+D4CC HANGUL SYLLABLE PWI, U+11B6 HANGUL JONGSEONG RIEUL-HIEUH> -> U+D4DB HANGUL SYLLABLE PWILH
$ pypy pprint_hangul.py 0x1111 0x1171 0x11b6
Composition:
<U+1111 HANGUL CHOSEONG PHIEUPH, U+1171 HANGUL JUNGSEONG WI, U+11B6 HANGUL JONGSEONG RIEUL-HIEUH> -> U+D4DB HANGUL SYLLABLE PWILH

许可证

这是根据麻省理工学院的许可证发布的。有关详细信息,请参阅此存储库中的LICENSE文件。

包含的^{TT31}$、^{TT3}$、^{TT33}$、^{TT34}$和^{TT35}$文件是Unicode,Inc.发布的Unicode®字符数据库的一部分。请在使用前咨询Unicode® Terms of Use

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Intellij通过方法中的包查找用法   java中VS代码和打包命名的问题   将java CMS功能集成到具有高度动态内容的网站(Lucene/Mysql/Nosql)的策略   oracle的java类强制转换异常。jdbc。驾驶员OracleConnection   字节码向JVM添加上指令   如何在抽象类中执行java方法?   java是否可以在apache访问日志中排除指定的GET参数?(作者:W7开发环境)   java如何获取已安装音频播放器的列表?   尝试向HS学生展示如何使用Java访问MS数据库   使用正则表达式java对给定行中的特定字符串进行计数   java JOOQ Select查询中的Select计数   方法Java,如何从二维双精度数组中找到特定值?   获取图像URL的java正则表达式   java在切换到新的窗口驱动程序后找不到元素