运行环境
Win11 系统,Anaconda Prompt,名为'rango'的虚拟环境,Edge 浏览器。
问题描述
最近在根据《Tango with Django》这本书学习 Django,在 Anaconda 黑窗口启用虚拟环境运行 python manage.py runserver 命令时意外报了 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 8: invalid continuation byte 的错误。该错误在重建 Django 项目、重新创建虚拟环境后仍然稳定复现,说明问题不在项目代码层面。

完整黑窗口命令以及报错记录如下:(Workspace 是我练习 django 的文件夹,有类似情况的朋友路径应该是 C:\Users\<你的 username>\<你的 workspace>)


原因分析
从上面图中 traceback 的最底部几行可以定位到关键调用链:
HTTPServer.server_bind(self)--socket.getfqdn(host)--socket.gethostbyaddr(name)
还有经常与中文字符问题相关的'utf-8'字样。
找到 socket.py 中的 getfqdn(),本例中的 name 应该是 127.0.0.1

错误就发生在这一行。
在 Windows 系统上,socket.gethostbyaddr() 会通过系统 API 反向解析本机 IP 地址,并返回当前电脑的 hostname(主机名)。
当调用 gethostbyaddr('127.0.0.1') 时,Windows 网络栈将该地址识别为本机回环地址,并返回当前主机名。
由于 Windows 返回的主机名使用本地编码(如 GBK),而 Python 标准库在接收该返回值时假定其为 UTF-8 编码,导致在解码阶段抛出 UnicodeDecodeError(Python 甚至'没来得及'成功给 hostname 赋值)。
本人在 Windows 的设置 - 系统中对电脑进行过重命名操作,且包含中文!





