Django报'ascii' codec无法编码字符,已设UTF-8仍失效是什么原因?
问题原因
- JS端未对URL参数做编码处理:非ASCII字符(比如西里尔文)直接拼接进URL不符合URL规范,会导致编码异常,后端拿到的参数本身就存在编码错误。
- Python端多余的编码操作:Django从
request.GET中拿到的参数默认是已经解码的Unicode字符串,你手动执行encode('UTF-8')后会得到bytes类型对象,后续用str(notes)转换时,若Python默认编码为ASCII,就会触发ASCII编码无法处理西里尔字符的报错。 - 编码不统一:如果你的数据库连接、表编码未设置为UTF-8,也可能在入库阶段触发编码报错。
解决建议
- JS端新增URL参数编码,将拼接逻辑改为用
encodeURIComponent处理输入值:
var notes = document.getElementById("notes").value; window.location.href = 'http://my-site/example?notes=' + encodeURIComponent(notes);
- 删掉Django端多余的编码逻辑,直接使用获取到的字符串即可,同时把默认值改为空字符串避免类型冲突:
notes = request.GET.get('notes', '') # 移除原有的try...encode代码块
- 调整SQL拼接逻辑,若坚持使用字符串拼接SQL,至少做引号转义避免注入风险,同时确保Django数据库配置、数据库表的编码都设置为UTF-8:
# 仅做演示,仍强烈建议改用参数化查询 sql = 'INSERT INTO table(notes) VALUES("%s")' % notes.replace('"', '\\"')
内容的提问来源于stack exchange,提问作者Earo
相关产品推荐
相关产品推荐

