当前位置: 首页 > news >正文

emoji对齐 特殊字符对齐 文本对齐

emoji如何对齐 特殊字符如何对齐 高级文本对齐

问题引出

我们在程序打印输出时,如何我们所输出的字符中包含emoji文本,或者其它特殊的字符文本,则我们的打印对齐效果将出现错位。以下代码复现了这一效果(tips: 马老师 前面的 | 符号是为了观察对齐效果):

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

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

20231104175834

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

原因解释

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

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

  • 显然,英文空格的字符显示宽度值是 1
  • 一个英文字符(大写和小写)的显示宽度值是 1
  • 对于以下显示的楷体字体下的中文,一个字符的显示宽度值是 2
    20231104181232

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

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

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

找出真凶

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

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

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

20231104222547

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

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

👆以上代码运行效果如下👇:
20231104213053
上图我们可以看到(注意看参考符号 | 的位置):

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

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

补救措施

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

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

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

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

20231104222101

其它的坑

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

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

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

小结

非常感谢大家的关注和阅读,如果哪里有些的不对的地方,望批评指出,以便及时修正。

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

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

小结

非常感谢大家的关注和阅读,如果哪里有些的不对的地方,望批评指出,以便及时修正。

相关文章:

emoji对齐 特殊字符对齐 文本对齐

emoji如何对齐 特殊字符如何对齐 高级文本对齐 问题引出 我们在程序打印输出时,如何我们所输出的字符中包含emoji文本,或者其它特殊的字符文本,则我们的打印对齐效果将出现错位。以下代码复现了这一效果(tips: 马老师…...

Selenium Python 中的动作链

Selenium 是一个用于自动化的独立的基于 Web 的工具。 它是任何人都可以使用的开源工具。 与Python语言结合使用该工具进行测试。 操作链是 Selenium 的基本组成部分,提供了一种管理低级交互的方法,例如按键、鼠标移动、鼠标按钮操作以及与上下文菜单的…...

OceanBase:03-集群部署

目录 一、集群规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录,修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、集群部署 1.OBD命令行部署 2. OBD白…...

PTA: 矩阵的乘法运算

矩阵的乘法运算 题目输入格式输出格式输入样例输出样例 代码 题目 线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时&…...

4K Video Downloader Pro v4.28.0(视频下载器)

4K Video Downloader Pro是一款专业的视频下载软件,支持从YouTube、Vimeo、Facebook、Instagram、TikTok等主流视频网站下载高质量的4K、HD和普通视频。它的操作流程简单,只需复制视频链接并粘贴到软件中即可开始下载。此外,该软件还提供了多…...

java pdf,word,ppt转图片

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…...

map set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 3.2 multiset 3.2.1 multiset的介绍 3.2.2 multiset的使用 3.3 map 3.3.1 map的介绍 3.3.2 map的使用 …...

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…...

解决ruoyi-vue部署到域名子路径静态资源404

参考ruoyi前端手册...

游戏引擎中为什么要用四元数表示旋转而不用欧拉角旋转?

个人观点&#xff0c;仅供参考&#xff0c;如有错误可太刺激了 四元数的简单概念和使用 欧拉角通常用于表示一个物体的旋转状态&#xff0c;而不是表示旋转过程。 欧拉角描述的是物体相对于某个参考坐标系的朝向或旋转状态&#xff0c;通常以不同的轴&#xff08;例如&#x…...

E-Office(泛微OA)前台任意文件读取漏洞复现

简介 泛微E-Office是一款企业级的全流程办公自动化软件&#xff0c;它包括协同办公、文档管理、知识管理、工作流管理等多个模块&#xff0c;涵盖了企业日常工作中的各个环节。在该产品前台登录页存在文件读取漏洞。 officeserver.php文件存在任意文件读取漏洞&#xff0c;通…...

前端小案例 | 喵喵大王立大功 | 一个带便利贴功能的todolist面板

文章目录 &#x1f4da;html&#x1f4da;css&#x1f4da;js&#x1f407;stickynote.js&#x1f407;todolist.js&#x1f407;clock.js &#x1f4da;html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…...

算法训练营第十一天 | 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

目录&#xff1a; 力扣 20. 有效的括号力扣 1047. 删除字符串中的所有相邻重复项力扣 150. 逆波兰表达式求值 问题一、 20. 有效的括号 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 很多朋友刚开始接触这一类题的时候…...

Python unittest单元测试框架 TestSuite测试套件

TestSuite 测试套件简介 对一个功能的验证往往是需要很多多测试用例&#xff0c;可以把测试用例集合在一起执行&#xff0c;这就产生了测试套件TestSuite 的概念&#xff0c;它是用来组装单个测试用例&#xff0c;规定用例的执行的顺序&#xff0c;而且TestSuite也可以嵌套Tes…...

FSB逮捕为乌克兰网络部队工作的俄罗斯黑客

导语 近日&#xff0c;俄罗斯联邦安全局&#xff08;FSB&#xff09;逮捕了两名涉嫌协助乌克兰网络部队对俄罗斯重要基础设施目标进行网络攻击的个人。这起事件引起了广泛关注&#xff0c;涉及到了网络安全和国际关系等多个领域。本文将为您详细介绍这一事件的背景和最新进展。…...

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】 1、概述2、实验环境3-1、 物品说明3-2、所遇问题&#xff1a;ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory ....”3-3、解决问题&#…...

LeetCode75——Day26

文章目录 一、题目二、题解 一、题目 394. Decode String Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guar…...

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p&#xff0c;请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如&#xff0c;在图8.9的二叉搜索树中&#xff0c;节点8的下一个节点是节点9&#xff0c;节点11的下一个节点是null。 分析&#xf…...

2023SHCTF web方向wp

1.ezphp 看一眼&#xff0c;你大爷&#xff0c;啥玩意都给我过滤完了。 还好下面有preg_replace()/e&#xff0c;会把replacement当作php语句执行 传参pattern.*&#xff0c; .*表示任意字符&#xff0c;code{${phpinfo()}} &#xff0c;为什么这样写&#xff0c;因为,print_…...

从物理磁盘到数据库 —— 存储IO链路访问图

原图来自&#xff1a;数据库IO链路访问图 – OracleBlog 由于很复杂&#xff0c;为了加深理解自己重新画了一次&#xff0c;另外参考其他文档补充了各部分的插图和介绍。 一、 存储服务器 1. 物理磁盘 外层的壳子称为硬盘笼 cage 2. chunklet Chunklet 是一个虚拟概念而不是实…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...