python3默认使用uwsgi-emperor的ascii

时间:2016-03-11 20:22:39

标签: python-3.x unicode encoding uwsgi

使用


postgres 9.5
psycopg2 2.6.2
python 3.4.2
system(debian jessie)locale:en_US.UTF-8
python的sys.stdout.encoding是UTF-8

数据库是UTF8,我有é,ç,è等条目......

pgcur.execute("SELECT * FROM table1")
rows = pgcur.fetchall()
for r in rows:
    print(r)

发出错误:
UnicodeEncodeError:'ascii'编解码器无法在位置521中加载字符'\ xe9':序数不在范围内(128)

我不明白,psycopg2连接编码是UTF8,数据库是UTF8,python3默认是字符串unicode ...为什么有ascii编解码器参与?

print(r.encoding('utf8'))

解决了这个问题,但我不记得使用postgresql 9.4(以及相同的psycopg2 / python版本)

我想念一下吗?

2 个答案:

答案 0 :(得分:1)

从postgres 9.4到9.5升级无关...... 默认情况下是uwsgi-emperor配置:

autoload = true

出于不明原因,错过了语言环境加载 使用该选项,当调用locale.getlocale()时,python3.4解释器返回(None,None),因此它默认为ANSI_X3.4-1968

#autload = true
plugins = python34

解决了这个问题,locale.getlocale()返回OS定义的语言环境(在这种特定情况下为UTF-8)

答案 1 :(得分:0)

如果错误在print上,print将Unicode字符串编码为终端的编码。如果终端配置错误(您使用的是Linux吗?),可能会选择ascii而不是Linux终端的典型utf8配置。检查LANG环境变量。