Python打印ASCII字符含中文时保持对齐
需求
我们打印Python字符串的时候,会在单词间增加空格和制表符,让输出的列表或ASCII表格对齐。
比如下面这个ASCII表格
# ╔════╦════════╦═════════╦═══════╗
# ║ id ║ name ║ course ║ score ║
# ╠════╬════════╬═════════╬═══════╣
# ║ 1 ║ Alex ║ English ║ 90 ║
# ║ 2 ║ Elaine ║ Math ║ 92 ║
# ║ 3 ║ Tom ║ Science ║ 88 ║
# ║ 4 ║ Sophia ║ History ║ 94 ║
# ╚════╩════════╩═════════╩═══════╝
字符串都是英文的时候没有问题,但是一旦字符串包含中文或者其它非 ASCII 字符,就会出现很难对齐的情况。
World!! ║ # 7个普通空格
Hello你好 ║ # 5个普通空格
Hello你好 ║ # 6个普通空格
原因在于中文这类非ASCII字符的宽度比英文字母的宽度大,这就要对中文进行特殊处理。
方案
为了让ASCII字符能够对齐,通常会在字符间隙增加足够的空格,普通的空格" "
属于ASCII字符,Unicode编码 U+0020
,而如果有中文或者中文标点符号的话,就需要使用中文全角空格来补齐空白,Unicode编码 U+3000
。
这里我们简单做一个演示,当我们识别字符的时候,统计中文字符的长度后,使用同等长度的普通空格和剩余长度的全角空格补齐。相当于每一个ASCII字符都有一个非ASCII字符配对,长度肯定相同。
可以得到以下输出
Hello你好 ║ # 2个普通空格+5个全角空格
World!! ║ # 7个全角空格
代码
import re
re_chinese = re.compile(r"[\u4e00-\u9fa5\!\?\。\"\'\(\)\*\+\,\-\/\:\;\<\=\>\@\[\\\]\^\_\`\{\|\}\~\⦅\⦆\、\〃\《\》\「\」\『\』\【\】\〔\〕\〖\〗\〘\〙\〚\〛\〜\〝\〞\〟\〰\〾\〿\–\—\‘\’\‛\“\”\„\‟\…\‧\﹏\.]", re.S)
def format_ascii(text) :
t= re.findall(re_chinese,text)
count = len(t)
return text + " " * count + u"\u3000" * (len(text) - count)
print(format_ascii("Hello你好") + "║")
print(format_ascii("World!!") + "║")
在线演示 Python 在线编辑器
总结
以上就是关于Python开发中遇到的中文字符串对齐问题,基本上满足了我们的开发需求,可能还有些细节没有注意到,欢迎大家提出更好的想法。
评论