Unicode字形助手

grapheme的Python项目详细描述


石墨烯

用于处理用户感知字符的python包。更具体地说, 使用grapheme集群的字符串操作和计算函数 由Unicode Standard Annex #29定义的组(图形)。

documentation

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处理器进行测试时,执行 一些可能的通话时间大致如下:

CodeApproximate 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_string4.0e-09 seconds
grapheme.contains(long_ascii_string, long_ascii_string[:100])3.9e-06 seconds
long_ascii_string[-100:] in long_ascii_string2.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版本发布一个新版本。

此操作所需的步骤:

  1. 验证Unicode中的规则集没有重大更改 Annex #29(见修改)。
  2. data files从unicode下载到u尼科德数据文件夹。 对于给定的版本,有一些在 UCD,有些在 UCD/Audio中。
  3. 运行生成流程数据文件来分析这些文件(将更新 grapheme\u break\u property.json文件)。
  4. 更新文档和源代码中的Unicode版本。
  5. 碰撞版本。

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

推荐PyPI第三方库


热门话题
Java Swing窗体的Nullpointerexception   java getWidth()在onCreate中返回0   java如何在扩展活动的类中显示Toast   jsp如何在Java中捕获HTTP 404   运行AlexaHelloWorldSample时出现java问题   jdatechooser Java日期选择器弹出日历   JavaGoogle在一个图表上绘制多条线   java日志文件备份问题   java获取实现泛型接口的类的泛型类型   Android Studio单元测试:读取数据(输入)文件   java合并两个Google地图代码   java Struts2 s:带有特殊字符的url参数未正确解码   java如何制作跳过开关的开关?   java如何在appium中验证元素唯一性   java搜索视图回收器视图搜索过滤器在安卓中无法正常工作