py3 中文字符串对齐问题

本文探讨了Python3中处理中文字符串对齐的问题,分析了多种实现方法,包括使用中文空格、字符集分类处理、ord值判断、正则表达式和GBK编码。推荐使用结合ord计算和GBK编码的混合方法,以保证效率和鲁棒性。并介绍了封装的对齐函数,包括左对齐、居中和右对齐,以及针对不同汉字域宽的处理。此外,还实现了一个二维数组对齐功能的arralign函数。
摘要由CSDN通过智能技术生成

一、综述

py3中str的len是计算字符数量,例如len(‘ab’) --> 2, len(‘a中b’) --> 3。
但在对齐等操作中,是需要将每个汉字当成宽度2来处理,计算字符串实际宽度的。
所以我们需要开发一个strwidth函数,效果: strwidth(‘ab’) --> 2,strwidth(‘a中b’) --> 4。

结论及推荐字符串域宽计算方法为:

def strwidth(s):
    """string width
    中英字符串实际宽度
    >>> strwidth('ab')
    2
    >>> strwidth('a⑪中⑩')
    7
    """
    try:
        res = len(s.encode('gbk'))
    except UnicodeEncodeError:
        count = len(s)
        for x in s:
            if ord(x) > 127:
                count += 1
        res = count
    return res

然后实现关键函数listalign用于处理某一列的对齐:

from align import listalign

ls = ['22', '哈哈', '中_文a']

print(*listalign(ls), sep='\n')
#          22
#      哈哈
#    中_文a

再利用listalign实现一个对齐二维数组的函数arralign:

from align import arralign

ls = [
    [1, '22', 'c'],
    [123, 4, '哈哈', 'cde'],
    [1, '中_文a', 'dd']
]

print(arralign(ls))
# print(arralign(ls, chinese_char_width=1.8)),本篇文章为了显示对齐,要用汉字域宽1.8的参数
#   1          22          c
# 123           4     哈哈  cde
#   1    中_文a         dd

完整代码: align.py

二、实现方法分析

百度一下能找到一些方法资料,我们来研究(TiGuan)一下。

2.1 使用中文空格chr(12288)

沧海漂游_,Python 中英文混输格式对齐问题,CSDN,2017.8
这篇原理是对只有中文的字符串,填充的时候用域宽也是2的中文空格“chr(12288)”代替域宽为1的英文空格,从而实现只有中文的某一列的对齐效果。但这样遇到中英文混合字符串,例如把“清华大学”改成’a清华大学b’,就对不齐了。

2.2 字符集分类处理

mozaibin,python 中英文混合格式化输出对齐,鱼C论坛,2018.4
mozaibin应该是对编码做分类计算,感觉搞复杂了,而且算一个“⑩”就出错了,算出来是1,实际上是2。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值