【问题标题】:Python 2 - Logging object containing unicodePython 2 - 包含 unicode 的日志记录对象
【发布时间】:2016-09-05 23:44:45
【问题描述】:

出于调试目的,我正在尝试记录其中包含 unicode 字符串的内容字典:

logging.info(str(data))

data 的结构如下:

{'whatever®': 1}

显然,当调用str() 时,UnicodeEncodeError 会爆炸,因为它会尝试使用底层的 ASCII 编解码器将 ® 符号转换为字节串。

由于 dict 实例没有 __unicode__ 方法,除了为这种从不转换 unicode 字符串的数据编写自己的 toString 函数之外,实现我想要做的事情的最佳方法是什么到字节串?在 stdlib 或我可以使用的任何外部库中是否有我不知道的实用程序函数?

【问题讨论】:

  • Python 2.7 不会以这种方式显示字典。它到底是什么样子的?例如,在我的 UTF-8 终端上,如果我输入data = {'whatever®':1},然后查看data,我会得到{'whatever\xc2\xae': 1},这是一个以UTF-8 编码的字节字符串。这可以毫无问题地记录下来。你到底有什么?

标签: python-2.7 unicode utf-8


【解决方案1】:

repr() 函数提供 Python 对象的模棱两可的文本表示,可用于测试、调试,并且似乎适合记录日志:logging.info(data) 应该按原样工作。

str(dict_object) 应该调用 repr(dict_object) 以递归方式调用 dict 的键和值上的 repr() 不应引发 UnicodeEncodeError 错误(结果仅包含 Python 2 上可打印的 ascii 字符)。

一个可能的解释是 UnicodeEncodeError 在显示 Unicode 内容期间发生(问题中没有 - 示例中有一个字节串,除非您使用 Python 3 或 from __future__ import unicode_literals),因为未配置语言环境(检查LANGLC_CTYPELC_ALLenvvars)或脚本的输出被重定向到管道、文件(在这种情况下设置PYTHONIOENCODINGenvvar)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2019-09-29
    • 2011-12-29
    • 2023-03-05
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多