你需要手动构建字符串,并且手动构建格式长度。没有简单的方法来完成这个任务。
以下三个函数可以实现此功能(需要unicodedata):
shortenStringCJK:正确缩短长度以适合某些输出(而不是截取X个字符的长度)。
def shortenStringCJK(string, width, placeholder='..'):
string_len_cjk = stringLenCJK(str(string))
if string_len_cjk > width:
cur_len = 0
out_string = ''
for char in str(string):
cur_len += 2 if unicodedata.east_asian_width(char) in "WF" else 1
if cur_len <= (width - len(placeholder)):
out_string += char
return "{}{}".format(out_string, placeholder)
else:
return str(string)
stringLenCJK:获取正确的长度(如在终端上占用的空间)
def stringLenCJK(string):
return sum(1 + (unicodedata.east_asian_width(c) in "WF") for c in string)
formatLen:将长度格式化以调整双字节字符的宽度。如果没有这个,长度将不平衡。
def formatLen(string, length):
return length - (stringLenCJK(string) - len(string))
要输出一些字符串:预定义格式字符串。
format_str = "|{{:<{len}}}|"
format_len = 26
string_len = 26
并输出如下结果(其中_string是要输出的字符串)
print("Normal : {}".format(
format_str.format(
len=formatLen(shortenStringCJK(_string, width=string_len), format_len))
).format(
shortenStringCJK(_string, width=string_len)
)
)