为了账号安全,请及时绑定邮箱和手机立即绑定

记录日期格式错误地将 │ 表示为 ¦

记录日期格式错误地将 │ 表示为 ¦

一只萌萌小番薯 2023-06-06 16:12:17
我有一个设置格式的日志记录脚本。它使用 utf-8 符号以提高可读性,编码设置为保存文件,如下所示。log = logging.getLogger('general')fmt = logging.Formatter('%(asctime)s.%(msecs)03d  │  %(levelname)-10s│  %(lineno)4s %(funcName)-20s│  %(message)s',                        datefmt='%Y/%m/%d │ %H:%M:%S')handler_error = logging.handlers.RotatingFileHandler("error.log", 'a', encoding="utf-8")handler_error.setLevel(logging.INFO)handler_error.setFormatter(fmt)log.addHandler(handler_error)理论上,所有的分隔符都应该是 │ 的,但是datefmt中的分隔符被改成了 ¦。因此,生成的日志如下所示 - 注意所有正确添加的垂直线,除了日期和时间之间的一组。我试过使用 unicode \u2502而不是 │,但没有帮助。有想法该怎么解决这个吗?日志截图编辑 - 来自另一个用户执行的错误日志。  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 1025, in emit    msg = self.format(record)  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 869, in format    return fmt.format(record)  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 610, in format    record.asctime = self.formatTime(record, self.datefmt)  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\logging\__init__.py", line 548, in formatTime    s = time.strftime(datefmt, ct)UnicodeEncodeError: 'locale' codec can't encode character '\u2502' in position 9: encoding error
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

解决方案:您需要设置LC_CTYPEUTF-8

以下更多方框图字符的示例表明在字符串中进行了一些字符转换datefmt(类似于 Windows 命令tree与 之间tree /A的区别)。

# -*- coding: utf-8 -*-


import time, locale

t = time.localtime()

datefmt = '%Y/%m/%d ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ %H:%M:%S'

print( '\n datefmt:', datefmt)


print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )

print( 'strftime:', time.strftime(datefmt, t) )


locale.setlocale(locale.LC_CTYPE, (locale.getlocale()[0], '1252'))

print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )

print( 'strftime:', time.strftime(datefmt, t) )


locale.setlocale(locale.LC_CTYPE, (locale.getlocale()[0], 'utf8'))

print( '\nLC_CTYPE:', locale.getlocale(category=locale.LC_CTYPE) )

print( 'strftime:', time.strftime(datefmt, t) )

输出:.\SO\63472673.py


 datefmt: %Y/%m/%d ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ %H:%M:%S


LC_CTYPE: ('Czech_Czechia', '1250')

strftime: 2020/08/20 ¦--¬L-++T++=¦-¬L-¦¦T¦+ 19:29:14


LC_CTYPE: ('Czech_Czechia', '1252')

strftime: 2020/08/20 -¦+++++¦--+-¦++++¦¦--+ 19:29:14


LC_CTYPE: ('Czech_Czechia', 'utf8')

strftime: 2020/08/20 ─│┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬ 19:29:14

不幸的是,我在 Python 源代码中找不到那个字符翻译(可以看到(我的本地)代码页有一个错误1250:字符─和│被翻译为¦和-,分别以相反的顺序......


查看完整回答
反对 回复 2023-06-06
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信