python实现emoji对齐特殊字符对齐高级文本对齐

 更新时间:2023年11月06日 09:23:24   作者:三块钱  
这篇文章主要为大家介绍了python实现emoji对齐特殊字符对齐高级文本对齐方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题引出

我们在程序打印输出时,如何我们所输出的字符中包含emoji文本,或者其它特殊的字符文本,则我们的打印对齐效果将出现错位。

以下代码复现了这一效果(tips: 马老师 前面的 | 符号是为了观察对齐效果):

# -*- coding:UTF-8 -*-
# region 引入必要依赖
from DebugInfo.DebugInfo import *
# endregion
if __name__ == "__main__":
    画板 = 打印模板()
    画板.打印空行(2)
    画板.准备表格()
    画板.添加一行('序号', '姓名', '自评', '班主任').修饰行(青字)  # 作为标题行
    画板.添加一行('1', '小红', '我很开朗', '|马老师')
    画板.添加分隔行()
    画板.添加一行('2', '猪小明', '我得了很多小花 ❌', '|马老师')
    画板.添加分隔行()
    画板.添加一行('3', '赵虹', '我有爱心♥', '|马老师')
    画板.添加分隔行()
    画板.添加一行('4', '张天志', '我是女生♀️我有长头发', '|马老师')
    画板.添加空行()
    画板.展示表格()

👆以上代码的运行打印对齐如下:

我们可以观察到,猪小明行,马老师靠前了

我们又可以观察到,张天志行,马老师靠后了

原因解释

为什么会出现上面的对齐的现象呢?这就要从字体说起了。
我们电脑上,所显示的符号肯定是通过某一个字体来显示的。所以同一个字,我们在宋体下看到的效果,和在黑体下看到的效果,是不一样的。

一个字符,显示其效果所占用的屏幕像素数量,称为字符的显示像素宽度;为方便其见,我们将字符的像素宽度相对于英文字符空格所占用的像素宽度的比值,做为下文我们要描述的字符显示宽度值。

  • 显然,英文空格的字符显示宽度值是 1
  • 一个英文字符(大写和小写)的显示宽度值是 1

对于以下显示的楷体字体下的中文,一个字符的显示宽度值是 2

显示,对于任何可以在电脑上显示的字符,其都有一个显示宽度,只是不同的字符,在不同的字体下,其显示宽度值不同罢了。

有了以上规律后,我们如果需要对齐文本,就会比较容易了。我们计算字符的显示宽度,根据其显示宽度,计算并补充对应数量的空格后,文本就可以达到对齐的效果。

那现在来说上面马老师对不齐的问题。根据上文中的对齐原理的解释,马老师对不齐,肯定是文本中存在了这样的字符,这字符计算的显示宽度,与其实际显示所占用的宽度不一致,导致在补充空格时空格数量计算错误。

找出真凶

在上面的表格中,我们发现符号 ❌ ♥ ♀️ 是不常的字符。我们把这几个字符拿掉,再来观察对齐效果,如下👇:

# -*- coding:UTF-8 -*-
# region 引入必要依赖
from DebugInfo.DebugInfo import *
# endregion
if __name__ == "__main__":
    画板 = 打印模板()
    画板.打印空行(2)
    画板.准备表格()
    画板.添加一行('序号', '姓名', '自评', '班主任').修饰行(青字)  # 作为标题行
    画板.添加一行('1', '小红', '我很开朗', '|马老师')
    画板.添加分隔行()
    # 画板.添加一行('2', '猪小明', '我得了很多小花 ❌', '|马老师')
    画板.添加一行('2', '猪小明', '我得了很多小花 ', '|马老师')
    画板.添加分隔行()
    # 画板.添加一行('3', '赵虹', '我有爱心♥', '|马老师')
    画板.添加一行('3', '赵虹', '我有爱心', '|马老师')
    画板.添加分隔行()
    # 画板.添加一行('4', '张天志', '我是女生♀️我有长头发', '|马老师')
    画板.添加一行('4', '张天志', '我是女生我有长头发', '|马老师')
    画板.添加空行()
    画板.展示表格()

👆以上代码运行效果如下👇:

嗯,对齐效果非常漂亮。

所以,我们将问题的焦点放在符号 ❌ ❤ ♀️ 这三个字符上。 以下代码打印并显示了这三个字符的显示宽度和实际占用宽度。

# -*- coding:UTF-8 -*-
# region 引入必要依赖
from DebugInfo.DebugInfo import *
# endregion
if __name__ == "__main__":
    画板 = 打印模板()
    画板.打印空行(2)
    画板.准备表格()
    画板.添加一行('字符','显示宽度值').修饰行(青字)
    画板.添加分隔行()
    画板.添加一行('❌|',显示宽度('❌'))
    画板.添加一行('♥|',显示宽度('♥'))
    画板.添加一行('♀️|',显示宽度('♀️'))
    画板.添加空行()
    画板.展示表格()

👆以上代码运行效果如下👇:

上图我们可以看到(注意看参考符号 | 的位置):

  • 字符 ❌ 显示占用宽度为1, 计算的显示宽度是2 (这将导致在对齐补空格时,少补一个空格)
  • 字符 ♥ 显示占用宽度为1,计算的显示宽度也是1 (实际显示宽度和计算显示宽度一致,对齐补齐空格正常)
  • 字符 ♀️ 显示占用宽度为2,但计算的显示宽度为1 (这将导致在对齐补空格时,多补一个空格)

所以,对齐出错的根本原因在于符号 ♥ 和 ♀️ 在终端显示时,显示这两个字符所占用的字符宽度与计算的字符宽度不一致,导致在计算对齐补空格时,补了错误数量的空格。

补救措施

有了以上的分析,我们知道了出现对齐错位的根本原因在于部分特殊的字符显示宽度值的计算与实际不符导致,那么我们对应的解决方案也就明朗了:修正特殊字符的显示宽度值

如下的代码,我们指定了特殊字符的显示宽度值,并将其告诉了【打印模板对象】(这里是画板),然后我们又打印显示了带有特殊字符的文本,观察其对齐效果:

# -*- coding:UTF-8 -*-
# region 引入必要依赖
from DebugInfo.DebugInfo import *
# endregion
if __name__ == "__main__":
    画板 = 打印模板()
    画板.打印空行(2)
    画板.准备表格()
    画板.设置特殊字符宽度字典({'❌': 1, '♀': 2})  # 修正特殊符号的显示宽度值
    画板.添加一行('序号', '姓名', '自评', '班主任').修饰行(青字)  # 作为标题行
    画板.添加一行('1', '小红', '我很开朗', '|马老师')
    画板.添加一行('2', '猪小明', '我得了很多小花❌', '|马老师')
    画板.添加一行('3', '赵虹', '我有爱心♥', '|马老师')
    画板.添加一行('4', '张天志', '我是女生♀️我有长头发', '|马老师')
    画板.添加空行()
    画板.展示表格()

👆上面的代码中,请留意 设置特殊字符宽度字典 方法,其修正了符号 ❌和 ♀️ 的显示宽度值,这帮助程序正确的理解和计算了字符的实际显示宽度,从而在对齐补齐空格时,可以补齐正确数量的空格。

其它的坑

在以上的分析过程中,我们所提到,所有在电脑上显示处理的符号,都依赖于字体,这也就是说,在不同的字体下,同一个符号可能显示的宽度(相对于空格或者符号 -),是有可能不同的,现观察到的部分字体中,英文字符的宽度如果计算为单位1,中文字符的宽度是1.5,在这种非整数倍的字体下,遇到中英文混合情况时,对齐处理是非常难的,甚至是无法做到的。

对于特殊字符,同样在不同的字体下,其显示宽度也是不同的,在实际的应用中要多加留意处理。

另外,为了方便文本对齐的计算,大家在实际使用时,需要注意终端所使用的字体是否是等宽字体,非等宽字体下,可能出现字体宽度不是整数的情况,对齐处理效果会受到影响。

小结

以上就是python实现emoji对齐特殊字符对齐高级文本对齐的详细内容,更多关于python特殊文本字符对齐的资料请关注脚本之家其它相关文章!

相关文章

  • Python中tuple类型的使用

    Python中tuple类型的使用

    在Python中,元组(tuple)是一种不可变的序列类型,可以包含多个值,这些值可以是不同类型的,本文主要介绍了Python中tuple类型的使用,感兴趣的可以了解一下
    2023-12-12
  • 基于Python实现高效PDF数据抽取工具

    基于Python实现高效PDF数据抽取工具

    在信息技术高度发展的今天,自动化处理日常文档成为提高工作效率的关键,下面我们就来看看如何使用Python实现高效PDF数据抽取工具,感兴趣的小伙伴可以了解下
    2026-05-05
  • 详解Python中的三器一闭

    详解Python中的三器一闭

    这篇文章主要介绍了详解Python中的三器一闭,Python中的三器一闭是指迭代器、装饰器、生成器和闭包,需要的朋友可以参考下
    2023-05-05
  • 使用Python脚本一键重命名序列帧图片的名称

    使用Python脚本一键重命名序列帧图片的名称

    在开发中,我们经常需要使用序列帧动画来实现下拉刷新、加载动画、空状态动效等交互,设计师交付的序列帧图片资源,命名往往各不相同,而我们的代码通常期望统一的命名规范,本文将教你使用一行Python脚本,实现图片的批量重命名,需要的朋友可以参考下
    2025-12-12
  • python 使用ctypes调用C/C++ dll详情

    python 使用ctypes调用C/C++ dll详情

    这篇文章主要介绍了python 使用ctypes调用C/C++ dll详情,文章首先通过导入ctypes模块,加载C/C++ dll到python进程空间展开主题相关内容,需要的小伙伴可以参考一下
    2022-04-04
  • Django 连接sql server数据库的方法

    Django 连接sql server数据库的方法

    这篇文章主要介绍了Django 连接sql server数据库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Pandas中统计汇总可视化函数plot()的使用

    Pandas中统计汇总可视化函数plot()的使用

    Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化函数plot()的使用,感兴趣的可以了解一下
    2025-05-05
  • WxPython建立批量录入框窗口

    WxPython建立批量录入框窗口

    这篇文章主要为大家详细介绍了WxPython建立批量录入框窗口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • python中DataFrame数据合并merge()和concat()方法详解

    python中DataFrame数据合并merge()和concat()方法详解

    Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析,下面这篇文章主要给大家介绍了关于python中DataFrame数据合并merge()和concat()方法的相关资料,需要的朋友可以参考下
    2022-07-07
  • 在Python3 numpy中mean和average的区别详解

    在Python3 numpy中mean和average的区别详解

    今天小编就为大家分享一篇在Python3 numpy中mean和average的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论