django 中文报错

在Django视图函数中经常出现类似于‘ascii‘ codec can‘t decode byte 0xef in position 0: ordinal not in range(128)的错误。

在解决错误之前,首先要了解unicode和utf-8的区别。

unicode指的是万国码,是一种“字码表”。而utf-8是这种字码表储存的编码方法。unicode不一定要由utf-8这种方式编成bytecode储存,也可以使用utf-16,utf-7等其他方式。目前大多都以utf-8的方式来变成bytecode。

其次,python中字符串类型分为byte string 和 unicode string两种。

如果在python文件中指定编码方式为utf-8(#coding=utf-8),那么所有带中文的字符串都会被认为是utf-8编码的byte string(例如:mystr="你好"),但是在函数中所产生的字符串则被认为是unicode string

问题就出在这边,unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就会产生这样的错误。例如:

self.response.out.write("你好"+self.request.get("argu"))

其中,"你好"被认为是byte string,而self.request.get("argu")的返回值被认为是unicode string。由于预设的解码器是ascii,所以就不能识别中文byte string。然后就报错了。

以下有两个解决方法:

1.将字符串全都转成byte string。

self.response.out.write("你好"+self.request.get("argu").encode("utf-8"))

2.将字符串全都转成unicode string。

self.response.out.write(u"你好"+self.request.get("argu"))

byte string转换成unicode string可以这样转unicode(unicodestring, "utf-8")

时间: 2024-10-07 17:28:07

django 中文报错的相关文章

python---补充django中文报错(2),Django3.5出错

今天是要Django3.5设置项目,结果出现中文报错,虽然之前分析过py2.7的报错原因,但是在py3之后reload不在使用,需要引入: from importlib import reload 但是这个并没有任何用,因为在py3之后默认编码不再是字节码,而是utf-8,可以使用代码查看 sys.getdefaultencoding() 这时候就出现了新的错误,出错地点 data = data.encode() AttributeError: 'bytes' object has no att

python---补充django中文报错

SyntaxError at /blog/ news/story Non-ASCII character '\xe4' in file D:\MyPython\day23\HelloWorld\blog\views.py on line 42, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details (views.py, line 42) 当使用中文时会报错: def introduce(req

django admin 中文报错incorrect string value解决方案

对于错误" Incorrect string value: '\xE6\xA2\xB5\xE8\x92\x82...'for column 'object_repr' at row 1 解决方法是设置django_admin_log表的object_repr一项使用utf8_unicode_ci: 对于错误"  Incorrect string value: '\xE6\xA2\xB5\xE8\x92\x82...'for column 'change_message' at row

客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. 最后经过多次测试,现把解决方案分享给大家. 第一步:打开mysql中的配置文件,my.ini,看一看配置文件中 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 看是不是这样配置的.因为utf8 是国际通用的,

新装python环境启动django程序报错

个人独立博客 http://www.xbman.cn/ 出处:http://www.xbman.cn/article/1 django启动报错 django.core.exceptions.ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3 解决方法 centos yum install python-deve

mybatis中xml的sql之test中文报错

在mybatis中sql,test中文报错( java.lang.NumberFormatException 这句话明确告诉了我们是数字格式异常).需加.tostring(). <if test="bookName == '毛选集'.tostring() "> and b.book_Name like #{bookName} </if>

Django 运行报错 ImportError: No module named &#39;PIL&#39;

importError: No module named pil WIN7 64位系统安装 Python PIL 首先通过easy_install安装 说找不到pil模块. 第二通过去官网找:http://www.pythonware.com/products/pil/ 找了几个版本安装版的没有64位的,源码包的下载无法安装说要安装vs2008我也安装了还是不行.最后在这个地址找到:http://www.lfd.uci.edu/~gohlke/pythonlibs/ Pillow is a re

iOS开发-url包含中文报错解决办法

经常, 我们用通过这样的方法调用API. NSString* urlString = [NSString stringWithFormat:@"http://api.douban.com/v2/movie/search?q=%@", content]; NSURL *url = [NSURL URLWithString:urlString]; testRequest = [ASIHTTPRequest requestWithURL:url]; [testRequest setDeleg

python3 与 Django 连接数据库报错:ImportError: No module named &#39;MySQLdb&#39;

在 python2 中,使用 pip install mysql-python 进行安装连接MySQL的库,使用时 import MySQLdb 进行使用 在 python3 中,改变了连接库,改为了 pymysql 库,使用pip install pymysql 进行安装,直接导入即可使用 但是在 Django 中, 连接数据库时使用的是 MySQLdb 库,这在与 python3 的合作中就会报以下错误了: ImportError: No module named 'MySQLdb' 解决方