Python 打印的中英文字体如何对齐?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


打印中英文字体如何对齐?

使用Python打印字体或者平时用word、记事本输入文本时会发现当输入中英文混写进经常出现不能对齐的情况,那么究竟是什么原因导致的?

a= '中文123'
b= 'ab123'
print(a+',',len(a))
print(b+',',len(b))
中文123, 5
ab123, 5

从打印的文本看出,带中文字符的字符串与英文字符串的长度都为5,但其打印出来的字符串宽度是不一样的。

由于中文字体的特殊结构其宽度在英文宽度下不能正常显示,中文字体的宽度是英文字母的一倍。
中文输入法在输入字符时会有全角与半角之分,全角模式下所有字符全部打印成相同宽度大小,相应的半角模式下输入中文字体时是全角(也只能是全角),但在输入英文或数字时会打印半角字符

例如:
全角模式下:中文输入法输入字
全角模式下:中文abc123
半角模式下:中文abc123
半角模式下:123456789

在上面的例子中,半角模式下发现中英混合字体与纯字母数字字体宽度仍不一样, 这是什么原因呢?
打印出来的字体宽度不一样就说明在字体样式下设计的中英字体的宽度就是不一样的,我们需要切换到中英字体宽度为等比1:2的字体样式。一般情况下可以在微软几个默认中文字体里来切换试下,比如等线字体就符合要求

在这里插入图片描述

了解了中英文混合字体宽度的问题,那么Python如何在中英字宽2:1的字体样式下将两段中英文字体对齐呢?


在Python下对齐打印中英文混合字符串

如下所示:打印出中英字符在字符串中对齐效果
在这里插入图片描述

1、初步想法:利用字符串函数Format()格式化输出

#强制左对齐
print('{:~>50}{:.<30}'.format(PrintCNChar('#强制左对齐:'),123456))
#强制右对齐
print('{:~>50}{:.>30}'.format(PrintCNChar('#强制左对齐:'),123456))
#强制居中
print('{:~>50}{:.^30}'.format(PrintCNChar('#强制居中:'),123456))
#强制在数字与符号之间放置填充,只对数字有效
print('{:~>50}{:.=+30}'.format('#强制在数字与符号之间放置填充:',123456))

输出效果如下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#强制左对齐:123456........................
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#强制左对齐:........................123456
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#强制居中:............123456............
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#强制在数字与符号之间放置填充:+.......................123456

显然输出结果没有对齐

2、字符串format函数打印分析

仔细观察打印的字符可以看出在字符串Format函数中是将中文字符与英文字符同时看作是一个字符的,也就是说其只是按照字符个数来打印固定长度的字符串,其最终结果的打印长度其实是不考虑的。
如果按照中英文等比2:1字体打印中英文字符其最终长度也不同,因为如果有中文或中文字符比较多的情况下同样会导致长度不同

3、创建一个简单的中英文对齐打印的函数

既然用字符串格式化无法对齐,那么就不能适用于对齐的应用,正确的方法应该统计所要打印的字符串中中文字符与英文字符个数,然后再将中英字符数乘以2,将最终的结果长度与打印长度(半角下长度)对比将剩余的字符补足,得到我们想要的结果

def PrintCNChar(string,length=0, sep=' '):
    iChineseCharNo = 0
    iEnglishCahrNo = 0
    iTotalCharNo =0
    if length ==0:
        return string

    for char in string:
        if u'\u4e00'<= char <=u'\u9fa5':#判断是否为中文字符,注意要用utf-8编码
           iChineseCharNo+=1
        else:
            iEnglishCahrNo+=1

    iTotalCharNo = iChineseCharNo*2+ iEnglishCahrNo

    if iTotalCharNo <= length:
        return sep*(length-iTotalCharNo)+string
    else:
        return 'error: length is less than string length' 

if __name__== '__main__':

    s1 = '{}'.format('#强制左对齐:')
    s2 = '{}'.format('#强制右对齐:')
    s3 = '{}'.format('#强制居中:')
    s4 = '{}'.format('#强制在数字与符号之间放置填充:')

    print(PrintCNChar(s1,50,'~')+'{:.<30}'.format(123456))
    print(PrintCNChar(s2,50,'~')+'{:.>30}'.format(123456))
    print(PrintCNChar(s3,50,'~')+'{:.^30}'.format(123456))
    print(PrintCNChar(s4,20,'~')+'{:.=+30}'.format(123456))

来看下最终效果

在这里插入图片描述


总结

如果要将打印的中英文字符对齐,要注意两方面:
1、全角及半角的区别
2、不同的字体样式会影响到打印字体的宽度,但中文字体总会比英文字符要宽,如果需要对齐要找中英1:2比例的字体样式

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值