【问题标题】:Encoding issue of str() for list or tuple in python2python2中列表或元组的str()编码问题
【发布时间】:2016-12-29 15:44:30
【问题描述】:

在我的脚本中,我从 DB 收到错误消息并希望在网页中显示它。当我没有在错误消息中收到本地字母时,它工作得很好。 消息是元组。

>>> # coding: utf-8
...

# string with u
>>> data1 = (1, u'Это мой текст')
>>> print data1[1]
Это мой текст
>>> print str(data1)
(1, u'\u042d\u0442\u043e \u043c\u043e\u0439 \u0442\u0435\u043a\u0441\u0442')

# string without u
>>> data2 = (1, 'Это мой текст')
>>> print data2[1]
Это мой текст
>>> print str(data2)
(1, '\xd0\xad\xd1\x82\xd0\xbe \xd0\xbc\xd0\xbe\xd0\xb9   \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82')

# I want like this
>>> str(data2).???  # WHAT I HAVE TO DO???
(1, 'Это мой текст')

# Current solution for me, but I want to know about better and more beautiful solution
>>> print ', '.join(map(lambda x: x.decode('utf-8') if isinstance(x, str) else str(x), data2))
1, Это мой текст

您能帮我找到 (???) 方法并解释为什么会发生这种情况。 谢谢!!!

【问题讨论】:

  • 请编辑您的帖子以添加您收到的错误。
  • 我没有收到错误,但网页上的输出如下:"(1, '\xd0\xad\xd1\x82\xd0\xbe \xd0\xbc\xd0\xbe\ xd0\xb9 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82')"
  • 那么您的解决方案有什么问题?
  • 我想知道更好更漂亮的解决方案。像这样:str(data2).???, where ???一种或两种标准方法。我在玩 decode() 和 encode(),但我没有得到我期望的结果。

标签: python string list encoding tuples


【解决方案1】:

当您打印一个对象(在您的情况下为turple)时,您将获得该对象的__str__ 方法的输出。不同对象的__str__方法是不同的:对于string,它是一个不带引号的字符串,对于turple,它创建一个包含开闭()的字符串以及其中包含的每个对象的__repr__方法产生的字符串。要获得您想要的结果,您应该组合方法(通过检查对象的类型),例如:

print ", ".join(map(lambda x: not isinstance(x, basestring) and str(x) or x, [1, "абв"]))
print ", ".join(map(lambda x: not isinstance(x, basestring) and str(x) or x, [1, u"абв"]))

当然,还有很多技巧。例如,您可以使用来自json 库的转储方法:

import json
print(json.dumps(("message", "уеуке"), ensure_ascii=False))
# ["message", "уеуке"]
print(json.dumps(("message", u"уеуке"), ensure_ascii=False))
# ["message", "уеуке"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多