邮件服务报编码错误(部署到服务器时) ERROR:root:‘ascii‘ codec can‘t encode

在服务器部署了“邮件定时任务”时,在触发发送时,一直报错编码错误,

INFO:sqlalchemy.engine.base.Engine:{'temp_id_1': 1, 'param_1': 1}
ERROR:root:'ascii' codec can't encode characters in position 11-16: ordinal not in range(128)

【原因分析】:定时任务的邮件内容存储于数据库中,使用的是“中文”存储,服务器读取时,由于服务器系统配置问题,中文转码读取出错;

【解决办法】:

1、配置系统编码   (然而网上找了好久方法,没有实现)

2、改变存储格式

【解决办法 1 】

找了网上很多解决办法,都无效(也许是我使用的不对)

比如:

解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题(转)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128)
解决UnicodeEncodeError: 'ascii' codec can't encode characters in position

转自:http://cooler1217.iteye.com/blog/1465335
异常: 'ascii' codec can't encode characters

字符集的问题,在文件前加两句话:

reload(sys)
sys.setdefaultencoding( "utf-8" )

完美解决,ok

另外(非转载):1. 当字符串里有 \n、\t、\r时,json.loads()失效,异常,要去掉;
2. 在操作数据库的时候用到 BasicDataSource 时,可以通过设置characterEncoding来解决中文乱码的问题,
BasicDataSource connPool;connPool.addConnectionProperty("characterEncoding", "UTF-8");;

http://blog.csdn.net/junshao90/article/details/7974030

使用以上办法,实测无效,

【解决办法2】

在数据存储到数据库前,先进行 json.dumps() 转码,再存入数据库。(这样很好的解决了,很多摸不着头脑的字符转码问题)

【其他收获】

数据库中存储一些python数据格式,比如 list、tuple、dict 等等数据,存储时,以前是用 字符串 格式存储,然后,在读取时,是用  eval()  来进行转换。(这个方法有点风险)

如果 通过 JSON 转码后再存储,有以下优势:

1)既解决了,中文字符转码问题   (通用的ascii,有很好的的兼容性)

2)又解决了 保留 原始数据类型的问题, 读取后 json.loads()  转出来,直接就是原来的数据类型数据格式

3)节省存储空间

劣势:

内容模糊搜索查询比较麻烦?

猜你喜欢

转载自blog.csdn.net/zzddada/article/details/114941529