print 的 string 内含有中文,如果为套上了颜色定义前缀,那么 ljust, rjust 的位置控制,基本上是废了? 如何破?

2021-03-21 00:27:51 +08:00
 qazwsxkevin

如:

AStr = "Test,这是一个中英混合的字句."
BStr = "\033[31m" + AStr  + "\033[0m" # 使 AStr 变成红色字体

print(len(AStr))
print(len(BStr))

# 这里的长度输出完全是两回事

# 那么如果有这样一个 string
def colorRed(s)
    retrun "\033[31m" + s  + "\033[0m"

assembleStr =  colorRed("Test") + "," + colorBlue("这是一个") + colorYellow("中英混合的字句.")

......
...
.

print(xxx.ljust(20),
      assembleStr.ljust(80),
      yyy.jlust(30))
      
assembleStr 的 ljust 根本不可精准控制位置,多行内容长短不一内容的话,整体屏幕上把后面 yyy 的位置弄得不整齐
ljust,rjust 在多颜色混合组装 string 的情况下,基本上是废了...

想寻求 2 种解决方法:

1 、更进一步如何精准控制 jljust 的窍门?
2 、是否有这种适合多颜色混合 print,而且能精准控制长度的轮子?

1874 次点击
所在节点    Python
14 条回复
BrettD
2021-03-21 00:35:34 +08:00
如果是以 UTF-8 编码储存在字符串里的话,截取子字符串应该按照 UTF-8 编码规则计算下表如
BrettD
2021-03-21 00:35:57 +08:00
如果是以 UTF-8 编码储存在字符串里的话,截取子字符串应该按照 UTF-8 编码规则计算下标位置
Pagliacii
2021-03-21 00:40:49 +08:00
qazwsxkevin
2021-03-21 02:26:36 +08:00
@BrettD 未能明白原理…
qazwsxkevin
2021-03-21 02:28:31 +08:00
@Pagliacii 简单试了一下,以它官网的例子 print 都不能正确显示出字体颜色……PyCharm,3.66 环境…
oott123
2021-03-21 09:48:20 +08:00
先补白 再着色
Pagliacii
2021-03-21 10:16:30 +08:00
@qazwsxkevin #5 Win10 CMD 和 Microsoft Terminal 都可以正常显示颜色。如果你的环境不能正确显示颜色的话,那么你是不是使用了 PyCharm 自带的终端?
qazwsxkevin
2021-03-21 10:18:15 +08:00
@oott123 感谢您的解答,我在其他资料了解到 pycharm 的控制台界面不支持默认颜色空间,那么如果我要在 pycharm 调试 rich,那就是很困难的事了吧,还有您提到的补白是怎么理解呢?抱歉,问得那么罗嗦
qazwsxkevin
2021-03-21 10:20:09 +08:00
@Pagliacii 的确是的,Console 显示颜色流水字符很必须,而我一直在用 pycharm 来调试程序,要换 IDE ?
Pagliacii
2021-03-21 10:23:35 +08:00
@qazwsxkevin #9 如果是 Windows 环境的话,可以用一下巨硬出品的 Terminal,https://github.com/microsoft/terminal

如果是 macOS 的话,可以使用 iTerm2 。如果是 Linux 的话,自带终端通常就可以
Pagliacii
2021-03-21 10:24:37 +08:00
@qazwsxkevin #9 IDE 只是方便你写代码和调试而已,不要被它约束住
oott123
2021-03-21 11:12:56 +08:00
@qazwsxkevin 补白就是说你用 ljust / rjust 补空格调整位置的意思,如果是因为颜色控制字符影响了空白数量,那么先调整位置再加颜色就可以了。
AndyAO
2021-03-21 12:33:08 +08:00
@qazwsxkevin #9 可以将内置终端更换为 pwsh,而不是默认 CMD,没记错的话,那里是支持 ANSI 色彩的,不过使用习惯需要改改
no1xsyzy
2021-03-21 23:31:15 +08:00
排版的话 tabulate[widechars] 吧,默认就支持 ANSI 控制字符,添加 widechars 支持双宽字符。

colorama 可以在 CMD 里使用 ANSI 颜色控制,方式是挂接 sys.stdout 和 sys.stderr,并将控制字符串翻译为 win32 API call

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/763554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX