2016-03-11 67 views
1

ASCII使用:
的Postgres 9.5
psycopg2 2.6.2
蟒蛇3.4.2
系統(Debian的傑西)語言環境:en_US.UTF-8
Python的sys.stdout的。編碼是UTF8python3默認與uwsgi皇帝

數據庫UTF8,我有é,C,E等的詞條,...

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

給出了一個錯誤:
UnicodeEncodeError:在521位置 'ASCII' 編解碼器不能安可字符 '\ xe9':在範圍序數不(128)

我不理解,psycopg2連接編碼是UTF8,數據庫是UTF8, python3是默認字符串unicode ...爲什麼有ascii編解碼器參與?

print(r.encoding('utf8')) 

解決了這個問題,但我不記得有這樣做,在PostgreSQL 9.4(和同psycopg2/Python的版本)

我錯過了什麼?

回答

1

無關,與從Postgres的9.4升級到9.5 ...
這是uwsgi皇帝配置默認:

autoload = true 

,對於一個不明原因,錯過語言環境負荷。
與該選項,python3.4解釋回報率(無,無)時locale.getlocale()被調用,因此它默認爲ANSI_X3.4-1968

#autload = true 
plugins = python34 

解決了這個問題,並locale.getlocale( )返回操作系統定義的語言環境(在這個特定情況下UTF-8)

0

如果錯誤位於print,print,則將Unicode字符串編碼爲終端的編碼。如果終端配置錯誤(您是否在Linux上),則可能選擇ascii而不是Linux終端的典型配置utf8。檢查LANG環境變量。

+0

可能是一個原因,是真的,但我只有一個語言環境安裝在我的系統上,它是UTF8 – comte

+0

@comte,是'print' ?你檢查過「LANG」是否正確? –

+0

是的,我檢查$ LANG是正確的。但不是隻打印,當發送變量到Bottle模板時,他也給我這個錯誤。有什麼奇怪的我從來沒有與postgresql 9.4(和相同的Python代碼,相同的系統)這個錯誤 – comte