You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:07:05