Python3生成Unicode字符表格时格式错乱,求修复方法
修复Unicode字符表格的对齐问题
- 问题本质:你代码里用固定的
<22s格式化Unicode字符,但不同Unicode字符的显示宽度不一致——ASCII字符占1列,东亚文字、全角符号等占2列,而str.format()的宽度参数是按字符个数计算,不是显示宽度,导致列错位。
修复方案一:使用专业库计算显示宽度(推荐)
wcwidth是专门用于计算终端字符显示宽度的库,能准确处理所有Unicode字符:
- 安装库:
pip install wcwidth
- 修改后的代码:
from wcwidth import wcswidth equal = " = " n = 5 char_target_width = 22 # 字符部分的目标显示宽度 for i in range(int(1000/n), int(6000/n)): for j in range(n): code = n * i + j + 1 char = chr(code) # 获取字符的实际显示宽度,无法识别时默认按1处理 char_width = wcswidth(char) if wcswidth(char) != -1 else 1 # 计算需要补充的空格数 padding = char_target_width - char_width # 格式化输出,保证每列总显示宽度一致 print(f'{code:<5d}{equal}{char}{" " * padding}', end="") print()
修复方案二:手动判断宽字符(无库依赖)
如果无法安装第三方库,可以通过字符范围粗略判断宽字符,适合临时场景:
equal = " = " n = 5 char_target_width = 22 def get_display_width(char): # 覆盖中文、日文、韩文等常见宽字符范围 if '\u4e00' <= char <= '\u9fff' or '\u3040' <= char <= '\u30ff' or '\uac00' <= char <= '\ud7af': return 2 return 1 for i in range(int(1000/n), int(6000/n)): for j in range(n): code = n * i + j + 1 char = chr(code) char_width = get_display_width(char) padding = char_target_width - char_width print(f'{code:<5d}{equal}{char}{" " * padding}', end="") print()
说明:方案一能处理emoji、组合字符等复杂Unicode场景,是最可靠的;方案二仅覆盖常见宽字符,适合快速临时修复。
内容的提问来源于stack exchange,提问作者yohan T.
相关产品推荐
相关产品推荐

