Python中英文对齐终极解决方案
问题描述
强迫症发作
对齐结果
成绩单对齐
# 汉字占两英文宽,则每存在一个汉字少填充一个长度
def pad_len(string, length):
return length - len(string.encode('GBK')) + len(string)
...
print("{0:<{len1}}\t{1:<{len2}}\t{2:>{len3}}".format(*line, len1=pad_len(line[0], 8), len2=pad_len(line[1], 20), len3=pad_len(line[2], 20)))
大学列表对齐
看起来是对齐的,在中英文字体宽度不是2倍宽度的情况下,但是format具有不确定性:
ulist = []
ulist.append([1, "清华大学", "10", "北京市"])
ulist.append([2, "中国科学技术大学", "10", "安徽合肥"])
ulist.append([3, "复旦大学", "10", "上海"])
print('^' * 40, '四列三行:列不同,行相同', '^' * 40)
for ul in ulist:
print("{0:{4}^6}\t{1:{4}<20}\t{2:{4}^10}\t{3:{4}<10}".format(*ul, chr(12288)))
print('+' * 40, '三列三行:列不同,行相同', '+' * 40)
for ul in ulist:
print("{0:^6}\t{1:{4}<20}\t{2:^10}".format(*ul, chr(12288)))
ulist.insert(0, ['编号', '大学', '评价', '省市'])
print('+' * 40, '四列四行:不仅列不同,行也不同', '+' * 40)
for ul in ulist:
print("{0:{4}^6}\t{1:{4}<20}\t{2:{4}^10}\t{3:<10}".format(*ul, chr(12288)))
print('x' * 40, '三列四行:不仅列不同,行也不同', 'x' * 40)
for ul in ulist:
print("{0:{4}^6}\t{1:{4}<20}\t{2:^10}".format(*ul, chr(12288)))
注意,行数相同(且每一列的字符行都和上一行的字符编码长度一样,前提条件),三列的时候和四列的情况还不一样,四列多一个 chr(12288)的填充字符。中英文混排列,总共N个列,也就是 N-1个列都需要chr(12288)。
列数相同(非前提条件,仅排除干扰因素),三行和四行(四行的第一行和第二行的字符编码长度不一样),所需要的 chr(12288)的填充字符 也不一样,少一个就不能对齐。
结论
结论一:在中英文长度倍数不确定的等宽字体下,能否对齐是不确定的,具体表现在:需要尝试加填充字符,且个数随着行列变化。
结论二:在中英文长度倍数确定为2的等宽字体下,能否对齐是确定的,具体表现在:无需设置填充字符,且可以统一计算长度。
结论三:面向字体编程,等宽字体对齐还靠运气。
本文例子参考了 他的博客
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!