Django表单输入波斯文触发UnicodeEncodeError的解决咨询
解决Django表单提交波斯文时的UnicodeEncodeError错误
问题场景
提交英文内容时表单功能正常,但提交波斯文(如متن تست)时触发UnicodeEncodeError,错误源于Windows控制台默认编码不支持非西欧字符。
相关代码
forms.py
from django import forms class NameForm(forms.Form): your_name = forms.CharField(label='Your name', max_length=100)
views.py
from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import NameForm def get_name(request): if request.method == 'POST': form = NameForm(request.POST) if form.is_valid(): print(form.cleaned_data) return HttpResponseRedirect('/') else: form = NameForm() return render(request, 'form.html', {'form': form})
form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form> </body> </html>
错误信息
UnicodeEncodeError at / 'charmap' codec can't encode characters in position 132-136: character maps to <undefined> Request Method: POST Request URL: http://127.0.0.1:8000/ Django Version: 4.1.7 Exception Type: UnicodeEncodeError Exception Value: 'charmap' codec can't encode characters in position 132-136: character maps to <undefined> Exception Location: C:\Program Files\Python311\Lib\encodings\cp1252.py, line 19, in encode Raised during: myapp.views.get_name Python Executable: C:\python\test1\venv\Scripts\python.exe Python Version: 3.11.2 Python Path: ['C:\\python\\test1', 'C:\\python\\test1', 'C:\\Program Files\\JetBrains\\PyCharm ' '2022.3.2\\plugins\\python\\helpers\\pycharm_display', 'C:\\Program Files\\Python311\\python311.zip', 'C:\\Program Files\\Python311\\DLLs', 'C:\\Program Files\\Python311\\Lib', 'C:\\Program Files\\Python311', 'C:\\python\\test1\\venv', 'C:\\python\\test1\\venv\\Lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm ' '2022.3.2\\plugins\\python\\helpers\\pycharm_matplotlib_backend'] Server time: Tue, 14 Mar 2023 19:06:06 +0000 The string that could not be encoded/decoded was: lue="متن تست
解决方案
这个错误并非Django本身的问题,而是Windows默认控制台编码(cp1252)不支持波斯文等非西欧字符导致,可通过以下方式解决:
方式1:强制Python标准输出用UTF-8
在views.py开头添加代码,修改标准输出的编码:
import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')
方式2:修改Windows控制台编码
在启动Django服务器前,在cmd或PowerShell中执行命令切换编码为UTF-8:
chcp 65001
之后再运行python manage.py runserver,控制台即可正常输出波斯文。
方式3:改用Django日志替代print
在settings.py中配置日志,将调试信息写入支持UTF-8的日志文件:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'debug.log', 'encoding': 'utf-8', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }
然后在views.py中替换print语句:
import logging logger = logging.getLogger(__name__) # 原print(form.cleaned_data)替换为 logger.debug(form.cleaned_data)
方式4:使用PyCharm终端模拟
如果用PyCharm开发,打开Run/Debug Configurations,找到你的Django服务器配置,勾选「Emulate terminal in output console」。PyCharm的模拟终端默认支持UTF-8编码,无需额外设置即可正常输出非西欧字符。
内容的提问来源于stack exchange,提问作者ArshamCoder
相关产品推荐
相关产品推荐

