代码之家  ›  专栏  ›  技术社区  ›  Hannu

Python unicode打印格式

  •  0
  • Hannu  · 技术社区  · 7 年前

    我有一个简单的Python(2.7)脚本,它读取数据库表并输出行。最初不需要使用unicode,脚本就是这样:

    users = config.Session.query(User).order_by(User.id).all()
    for _f in users:
        print "{0:6d}   {1:20}  {2:30}    {3:}".format(_f.id, _f.foo, _f.name, _f.url)
    

       739   42352                 Foo Bar                           https://...
       740   23555                 Another User                      https://...
       741   774577                Third User                        https://...
    

    然后我们开始在数据库中输入重音名称。最初,脚本开始提出一个关于ascii编解码器不满意的异常。

    我试图修复脚本,我做到了。我去掉了这个例外,但现在名称中的每个重音字符似乎都是双倍的,导致URL字段关闭了N个字符,N是名称中重音字符的数量。

    for _f in users:
        uname = _f.name.encode('utf-8')
        print "{0:6d}   {1:20}  {2:30}    {3:}".format(_f.id, _f.foo, uname, _f.url)
    

    现在的输出是:

       739   42352                 Foo Bar                           https://...
       740   23555                 Änöther User                    https://...
       741   774577                Third User                        https://...
    

    我需要在格式化字符串中添加什么才能正确计算带有重音字符的unicode字符串的长度?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark Tolonen    7 年前

    使用多字节UTF-8编码打印字节字符串是一个问题。不要对其进行编码,使用Unicode字符串,例如。 print u"{0:6d}..." .

    例子:

    print "1234567890"*3
    print "{0:20}  xxx".format(u"Another User")
    print "{0:20}  xxx".format(u"Änöther User".encode('utf8'))
    print u"{0:20}  xxx".format(u"Änöther User")
    

    输出:

    123456789012345678901234567890
    Another User          xxx
    Änöther User        xxx
    Änöther User          xxx