当前位置: 首页 > 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 是一个虚拟概念而不是实…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...