V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 2021-03-21 00:27:51 +08:00 · 1872 次点击
    这是一个创建于 1379 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如:

    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,而且能精准控制长度的轮子?

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

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

    colorama 可以在 CMD 里使用 ANSI 颜色控制,方式是挂接 sys.stdout 和 sys.stderr,并将控制字符串翻译为 win32 API call
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1919 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.