Unicode字形助手
grapheme的Python项目详细描述
石墨烯
用于处理用户感知字符的python包。更具体地说, 使用grapheme集群的字符串操作和计算函数 由Unicode Standard Annex #29定义的组(图形)。
pip install grapheme
当前支持的Unicode版本:12.0.0(12.1.0有/将添加一个单独的码位,不影响字形)。
什么?为什么?
Unicode字符串由一系列Unicode字符组成,但Unicode字符不 始终映射到用户感知的角色。一些人类感知的特征表现为 或更多Unicode字符。
但是,所有内置的python字符串函数和字符串方法都使用单个unicode字符 不考虑他们之间的联系。
>>>string='u̲n̲d̲e̲r̲l̲i̲n̲e̲d̲'>>>len(string)20>>>grapheme.length(string)10>>>string[:3]'u̲n'>>>grapheme.substr(string,0,3)'u̲n̲d̲'
这个库实现了扩展grapheme集群的unicode默认规则,并提供 一组基于图形的字符串操作函数。
我什么时候应该考虑用字母代替Unicode字符?
在以下情况下,您应该考虑在Unicode代码点上使用Graphemes:
- 您希望计算用户感知的字符数。
- 您希望以某些用户认为的长度拆分或截断文本。
- 您希望拆分或截断文本,而不会损坏字符。
- 按长度格式化文本,例如以等距字体创建基于文本的表格
在以下情况下,您应该使用普通的python字符串函数:
- 您希望按Unicode代码点计数或拆分以符合存储要求 限制(如数据库最大长度)
- 当使用通过Unicode字符限制字符串的系统时 长度
- 当您将性能优先于正确性时(请参阅下面的性能说明)
- 使用非常长的字符串时(请参见下面的性能说明)
- 如果简单比准确更重要
性能
计算图形需要遍历字符串并检查每个字符 违反一组规则和前面的字符。因为这个,所有 此模块中的函数将按字符串长度线性缩放。
只要可能,它们将只在需要时遍历字符串并返回 只要请求的输出被生成。例如,grapheme.slice 函数只需遍历字符串,直到找到最后一个请求的grapheme,并且 不在乎绳子的其他部分。
您可能只应该使用这个包来测试/操作相当短的字符串 或以长弦开头。
当使用10000个ascii字符的字符串和3.1ghz处理器进行测试时,执行 一些可能的通话时间大致如下:
Code | Approximate execution time |
---|---|
len(long_ascii_string) | 8.1e-10 seconds |
grapheme.length(long_ascii_string) | 1.5e-04 seconds |
grapheme.length(long_ascii_string, 500) | 8.7e-06 seconds |
long_ascii_string[0:100] | 1.3e-09 seconds |
grapheme.slice(long_ascii_string, 0, 100) | 2.5e-06 seconds |
long_ascii_string[:100] in long_ascii_string | 4.0e-09 seconds |
grapheme.contains(long_ascii_string, long_ascii_string[:100]) | 3.9e-06 seconds |
long_ascii_string[-100:] in long_ascii_string | 2.1e-07 seconds |
grapheme.contains(long_ascii_string, long_ascii_string[-100:]) | 1.9e-04 seconds |
在以后的版本中,执行时间可能会有所改进,但计算图表的时间是并将继续 比仅计算Unicode代码点要慢得多。
石墨烯簇组的示例
这不是一个完整的列表,而是一些图表何时使用多个 字符:
- CR+LF
- 朝鲜文(朝鲜语)
- 带有修饰符的表情符号
- 组合标记
- 零宽度连接
开发快速入门
如果您希望贡献或编辑此包,请创建一个fork并克隆它。
然后以本地可编辑(-e)模式安装并运行测试。
pip install -e .[test]
py.test
Unicode版本升级
库将为每个新的unicode版本发布一个新版本。
此操作所需的步骤:
- 验证Unicode中的规则集没有重大更改 Annex #29(见修改)。
- 将data files从unicode下载到u尼科德数据文件夹。
对于给定的版本,有一些在
UCD,有些在 UCD/Audio中。 - 运行生成流程数据文件来分析这些文件(将更新 grapheme\u break\u property.json文件)。
- 更新文档和源代码中的Unicode版本。
- 碰撞版本。