pip install wcwidth
python -c "from wcwidth import wcswidth; print(wcswidth('中文abc'), len('中文abc'))"
column -t report.txt
脚本打印对账单,用 ljust(20) 对齐商品名,中文行比英文行整体右移,列线对不齐,含 emoji 的行偏得更多。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,Python 的 len 数的是码点,终端显示宽度按东亚宽字符算,一个汉字占两列。emoji 和组合字符的宽度还要单独判断。
这次卡住的地方就在「宽字符对齐」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:用 wcwidth 计算显示宽度再补空格;截断时也按显示宽度累加 不要按字符数;表头和数据用同一套宽度计算;输出到文件时关闭颜色码 避免转义序列被算进宽度。
改完只确认一件事:中英文混合的表格列线对齐 每列宽度和预期一致。
