UnicodeEncodeError

本文探讨了在抓取网页源代码时遇到的Python编码问题,详细解释了如何避免gbk编码无法处理xbb字符的错误。文章指出,print和open函数默认不使用utf-8编码,需手动设置;同时,write函数参数必须是str类型,若为bytes类型需先进行decode。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在抓取网页上面的一些源代码的时候,将uft-8的编码写入文档,并输出的时候,出现这了这个报错,说gbk无法编码\xbb

查找相关资料:

1.str转bytes叫encode,bytes转str叫decode

2.字符就是unicode字符,字符串就是unicode字符数组

原来,print(),open()函数的默认编码不是utf-8,修改编码方式即可

补充一下write()函数: write()函数涉及的问题,那就是它的参数必须是str,不能是bytes,也就是说fp.write(result)中的result参数如果是bytes需要先decode成str(比如result.decode('utf-8')),才能使用open()函数的encoding 

 

 

https://blog.csdn.net/Day_upon/article/details/84189824 

2025-06-25 16:21:10,826 - INFO - ============================================================ 2025-06-25 16:21:10,826 - INFO - ============================================================ 2025-06-25 16:21:10,826 - INFO - ============================================================ 2025-06-25 16:21:10,834 - INFO - 启动高级访问控制绕过系统 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-44: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 408, in main log_info("启动高级访问控制绕过系统") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '启动高级访问控制绕过系统' Arguments: () 2025-06-25 16:21:10,834 - INFO - 启动高级访问控制绕过系统 2025-06-25 16:21:10,834 - INFO - 启动高级访问控制绕过系统 2025-06-25 16:21:10,835 - INFO - 目标: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=1086 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-34: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 409, in main log_info(f"目标: {TARGET_URL}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '目标: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=1086' Arguments: () 2025-06-25 16:21:10,835 - INFO - 目标: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=1086 2025-06-25 16:21:10,835 - INFO - 目标: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=1086 2025-06-25 16:21:10,842 - INFO - 用户: a3280844548 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-34: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 410, in main log_info(f"用户: {USERNAME}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '用户: a3280844548' Arguments: () 2025-06-25 16:21:10,842 - INFO - 用户: a3280844548 2025-06-25 16:21:10,842 - INFO - 用户: a3280844548 2025-06-25 16:21:10,844 - INFO - 时间: 2025-06-25 16:21:10 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-34: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 411, in main log_info(f"时间: {time.strftime('%Y-%m-%d %H:%M:%S')}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '时间: 2025-06-25 16:21:10' Arguments: () 2025-06-25 16:21:10,844 - INFO - 时间: 2025-06-25 16:21:10 2025-06-25 16:21:10,844 - INFO - 时间: 2025-06-25 16:21:10 2025-06-25 16:21:10,846 - INFO - ============================================================ 2025-06-25 16:21:10,846 - INFO - ============================================================ 2025-06-25 16:21:10,846 - INFO - ============================================================ 2025-06-25 16:21:10,846 - INFO - 执行登录协议... --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-38: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 419, in main login_success = site_login(session) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 141, in site_login log_info("执行登录协议...") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '执行登录协议...' Arguments: () 2025-06-25 16:21:10,846 - INFO - 执行登录协议... 2025-06-25 16:21:10,846 - INFO - 执行登录协议... 2025-06-25 16:21:10,848 - INFO - 获取CSRF令牌... --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-34: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 419, in main login_success = site_login(session) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 144, in site_login csrf_token = get_csrf_token(session, LOGIN_URL) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 92, in get_csrf_token log_info("获取CSRF令牌...") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '获取CSRF令牌...' Arguments: () 2025-06-25 16:21:10,848 - INFO - 获取CSRF令牌... 2025-06-25 16:21:10,848 - INFO - 获取CSRF令牌... 2025-06-25 16:21:11,472 - WARNING - 无法获取CSRF令牌,使用动态生成 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-39: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 419, in main login_success = site_login(session) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 144, in site_login csrf_token = get_csrf_token(session, LOGIN_URL) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 132, in get_csrf_token log_warning("无法获取CSRF令牌,使用动态生成") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 70, in log_warning logger.warning(safe_str(message)) Message: '无法获取CSRF令牌,使用动态生成' Arguments: () 2025-06-25 16:21:11,472 - WARNING - 无法获取CSRF令牌,使用动态生成 2025-06-25 16:21:11,472 - WARNING - 无法获取CSRF令牌,使用动态生成 2025-06-25 16:21:13,630 - WARNING - 登录状态验证失败 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-43: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 419, in main login_success = site_login(session) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 194, in site_login log_warning("登录状态验证失败") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 70, in log_warning logger.warning(safe_str(message)) Message: '登录状态验证失败' Arguments: () 2025-06-25 16:21:13,630 - WARNING - 登录状态验证失败 2025-06-25 16:21:13,630 - WARNING - 登录状态验证失败 2025-06-25 16:21:13,638 - WARNING - 登录失败,尝试继续执行 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-39: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 422, in main log_warning("登录失败,尝试继续执行") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 70, in log_warning logger.warning(safe_str(message)) Message: '登录失败,尝试继续执行' Arguments: () 2025-06-25 16:21:13,638 - WARNING - 登录失败,尝试继续执行 2025-06-25 16:21:13,638 - WARNING - 登录失败,尝试继续执行 2025-06-25 16:21:13,665 - INFO - 获取购买参数... --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-38: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 425, in main purchase_url = get_purchase_params(session, TARGET_URL) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 207, in get_purchase_params log_info("获取购买参数...") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '获取购买参数...' Arguments: () 2025-06-25 16:21:13,665 - INFO - 获取购买参数... 2025-06-25 16:21:13,665 - INFO - 获取购买参数... 2025-06-25 16:21:17,002 - INFO - 从文本提取购买链接: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-41: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 425, in main purchase_url = get_purchase_params(session, TARGET_URL) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 249, in get_purchase_params log_info(f"从文本提取购买链接: {full_url}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '从文本提取购买链接: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff' Arguments: () 2025-06-25 16:21:17,002 - INFO - 从文本提取购买链接: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff 2025-06-25 16:21:17,002 - INFO - 从文本提取购买链接: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff 2025-06-25 16:21:17,005 - INFO - 尝试购买内容: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 33-38: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 429, in main purchase_success = purchase_content(session, purchase_url) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 266, in purchase_content log_info(f"尝试购买内容: {purchase_url}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '尝试购买内容: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff' Arguments: () 2025-06-25 16:21:17,005 - INFO - 尝试购买内容: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff 2025-06-25 16:21:17,005 - INFO - 尝试购买内容: http://nzaj5zn2dx.355328web33.top.355328.com/baidu/job.php?action=buytopic&tid=1086&pid=tpc&verify=8e5e04ff 2025-06-25 16:21:21,946 - WARNING - 购买结果未知,请检查响应文件 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-41: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 429, in main purchase_success = purchase_content(session, purchase_url) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 334, in purchase_content log_warning("购买结果未知,请检查响应文件") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 70, in log_warning logger.warning(safe_str(message)) Message: '购买结果未知,请检查响应文件' Arguments: () 2025-06-25 16:21:21,946 - WARNING - 购买结果未知,请检查响应文件 2025-06-25 16:21:21,946 - WARNING - 购买结果未知,请检查响应文件 2025-06-25 16:21:21,950 - WARNING - 响应片段: <!-- --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt... --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-39: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 429, in main purchase_success = purchase_content(session, purchase_url) File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 337, in purchase_content log_warning(f"响应片段: {snippet}") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 70, in log_warning logger.warning(safe_str(message)) Message: '响应片段: <!--\r\n-->\r\r\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\r\n<html xmlns="http://www.w3.org/1999/xhtml">\r\r\n<head>\r\r\n<meta htt...' Arguments: () 2025-06-25 16:21:21,950 - WARNING - 响应片段: <!-- --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt... 2025-06-25 16:21:21,950 - WARNING - 响应片段: <!-- --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt... 2025-06-25 16:21:21,951 - ERROR - 购买失败,无法获取内容 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 34-37: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 448, in main log_error("购买失败,无法获取内容") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 73, in log_error logger.error(safe_str(message)) Message: '购买失败,无法获取内容' Arguments: () 2025-06-25 16:21:21,951 - ERROR - 购买失败,无法获取内容 2025-06-25 16:21:21,951 - ERROR - 购买失败,无法获取内容 2025-06-25 16:21:21,984 - INFO - 程序执行完成,耗时: 11.16秒 --- Logging error --- Traceback (most recent call last): File "/var/containers/Bundle/Application/F478C67C-EC3B-4CC7-AF32-6AA2047D0745/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/logging/__init__.py", line 1104, in emit stream.write(msg + self.terminator) UnicodeEncodeError: 'ascii' codec can't encode characters in position 34-39: ordinal not in range(128) Call stack: File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 464, in <module> main() File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 461, in main log_info(f"\n程序执行完成,耗时: {elapsed:.2f}秒") File "/private/var/mobile/Containers/Shared/AppGroup/64BBE982-65A5-49E2-91F8-F4215FF90576/Pythonista3/Documents/Untitled.py", line 67, in log_info logger.info(safe_str(message)) Message: '\n程序执行完成,耗时: 11.16秒' Arguments: () 2025-06-25 16:21:21,984 - INFO - 程序执行完成,耗时: 11.16秒 2025-06-25 16:21:21,984 - INFO - 程序执行完成,耗时: 11.16秒 再次分析原因修正代码
最新发布
06-26
<think>我们正在处理用户的问题:如何修复Pythonlogging模块中的UnicodeEncodeError:'ascii'codeccan'tencodecharacters错误。根据用户描述,错误发生在使用logging模块记录日志时,当包含非ASCII字符时,会抛出编码错误。原因分析:在Python2中,默认的编码是ASCII。当logging模块尝试将Unicode字符串写入文件或控制台时,如果遇到非ASCII字符,而目标流(如文件)没有指定编码,就会使用默认的ASCII编码,从而导致编码错误。解决方案:1.确保在记录日志时,传入的字符串是Unicode字符串(使用u前缀)或者在需要时正确编码。2.为logging处理器(如FileHandler)指定合适的编码(通常是'utf-8')。在Python3中,字符串默认是Unicode,而且logging模块默认使用UTF-8编码,因此这个问题在Python3中较少出现。但用户提到使用Python2.5,所以我们将针对Python2提供解决方案。步骤:1.配置FileHandler时,指定编码为'utf-8'。2.确保在记录日志时,如果传递的是非Unicode字符串,它应该是UTF-8编码的字节字符串(但最好使用Unicode字符串,并在处理时进行编码)。示例代码:错误情况:```pythonimportlogginglogging.basicConfig(filename='example.log',level=logging.DEBUG)logging.info(u'这是一个包含非ASCII字符的日志,比如中文')```这可能会引发UnicodeEncodeError。正确做法:在Python2中,我们可以通过以下方式避免:方法1:使用FileHandler并指定编码```pythonimportlogging#创建一个FileHandler,并设置编码为utf-8file_handler=logging.FileHandler('example.log',encoding='utf-8')file_handler.setLevel(logging.DEBUG)#设置格式formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')file_handler.setFormatter(formatter)#获取根日志记录器并添加处理器logger=logging.getLogger()logger.addHandler(file_handler)#现在记录Unicode字符串logger.info(u'这是一个包含非ASCII字符的日志,比如中文')```方法2:如果使用basicConfig,在Python2.6及以上版本中,basicConfig支持指定编码(但用户使用的是Python2.5,所以可能不支持)。因此,对于Python2.5,我们只能通过显式创建FileHandler来实现。另外,如果日志中混合了字节字符串和Unicode字符串,也可能会导致问题。建议在整个应用程序中统一使用Unicode字符串,并在输入输出时进行编解码。注意:如果日志输出到控制台,而控制台的环境编码不是UTF-8(例如Windows的cmd默认是GBK),那么也需要相应地调整编码。但用户的问题是关于文件的,所以我们先解决文件日志。用户可能遇到的另一个情况:在记录异常信息时,如果异常信息包含非ASCII字符,同样需要处理。我们可以通过设置一个全局的编码策略来避免这个问题,例如使用`codecs`模块打开文件,但logging模块的FileHandler已经支持编码参数,所以直接使用FileHandler是标准做法。总结:关键是为日志文件指定正确的编码(如UTF-8)并在记录时使用Unicode字符串。根据引用[1]:Dreamhost上使用python2.5遇到UnicodeEncodeError,解决方法也是确保正确编码。这里我们采用了指定文件编码的方法。相关问题:1.如何确保整个Python项目都正确处理Unicode?2.在Python3中,logging模块的默认行为是什么?3.除了指定编码,还有其他方法避免UnicodeEncodeError吗?</think>### Python logging UnicodeEncodeError 修复指南 当使用Python的logging模块记录包含非ASCII字符(如中文)的日志时,会出现`UnicodeEncodeError: 'ascii' codec can't encode characters`错误。这是因为Python 2.x默认使用ASCII编码处理日志输出,无法处理Unicode字符。以下是系统化的解决方案: #### 核心修复方法 1. **显式指定文件编码**(推荐方案) 创建FileHandler时明确设置`encoding='utf-8'`参数: ```python import logging # 创建带UTF-8编码的FileHandler file_handler = logging.FileHandler('app.log', encoding='utf-8') file_handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s')) logger = logging.getLogger() logger.addHandler(file_handler) # 安全记录中文日志 logger.info(u"用户操作: 保存设置") # Python 2需显式使用u前缀 ``` 2. **修改默认编码环境**(临时方案) 在程序入口处重设默认编码(不推荐长期使用): ```python import sys reload(sys) # Python 2专用 sys.setdefaultencoding('utf-8') # 可能影响其他模块 ``` #### Python 3的特殊处理 Python 3默认支持Unicode,但仍需注意: ```python # Python 3中只需确保字符串为str类型 logger.info("用户操作: 保存设置") # 直接使用字符串 # 若从外部获取数据需显式解码 data = b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') # 字节串转Unicode logger.info(data) ``` #### 最佳实践建议 1. **统一编码规范**: - 源文件头部声明编码:`# -*- coding: utf-8 -*-` - 所有字符串使用`u"中文"`格式(Python 2) - 避免混合使用字节串(`bytes`)和字符串(`str`) 2. **异常处理增强**: ```python try: logger.error(u"错误操作: {}".format(user_input)) except UnicodeEncodeError: # 降级处理:移除非常用字符 safe_msg = user_input.encode('ascii', 'ignore').decode('ascii') logger.error("Sanitized: " + safe_msg) ``` 3. **环境配置检查**: ```python import locale print(locale.getpreferredencoding()) # 检测系统默认编码 ``` > **根本原因**:Python 2的logging模块默认使用`sys.getdefaultencoding()`(通常为ASCII)处理日志输出,当遇到Unicode字符时触发编码错误。显式指定UTF-8编码可彻底解决该问题[^1]。 #### 验证方法 ```python # 测试脚本 test_logging.py import logging handler = logging.FileHandler('test.log', encoding='utf-8') logging.basicConfig(handlers=[handler], level=logging.INFO) logging.info(u"测试中文: 你好世界!") # 检查日志文件是否正常显示 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值