2011-10-21 47 views
1

編輯:cx_Oracle - 編碼查詢結果爲RAW

下打印顯示了我的預期值。

(sys.stdout.encoding和sys.stdin.encoding都是'UTF-8')。

爲什麼變量值與其打印值不同?我需要將原始值變成一個變量。

>>username = 'Jo\xc3\xa3o' 
>>username.decode('utf-8').encode('latin-1') 
'Jo\xe3o' 
>>print username.decode('utf-8').encode('latin-1') 
João 

原題:

我有一個問題,查詢BD和值解碼成Python。

我證實了我的DB NLS_LANG使用

select property_value from database_properties where property_name='NLS_CHARACTERSET'; 

'''AL32UTF8 stores characters beyond U+FFFF as four bytes (exactly as Unicode defines 
UTF-8). Oracle’s 「UTF8」 stores these characters as a sequence of two UTF-16 surrogate 
characters encoded using UTF-8 (or six bytes per character)''' 

os.environ["NLS_LANG"] = ".AL32UTF8" 

.... 
conn_data = str('%s/%[email protected]%s') % (db_usr, db_pwd, db_sid) 

sql = "select user_name apex.users where user_id = '%s'" % userid 

... 

cursor.execute(sql) 
ldap_username = cursor.fetchone() 
... 

其中

print ldap_username 
>>'Jo\xc3\xa3o' 

我用盡全力(返回相同)

ldap_username.decode('utf-8') 
>>u'Jo\xe3o' 
unicode(ldap_username, 'utf-8') 
>>u'Jo\xe3o' 

其中

u'João'.encode('utf-8') 
>>'Jo\xc3\xa3o' 

如何將查詢結果返回給適當的「João」?

回答

1

你已經有了適當的'João',methinks。 >>> 'Jo\xc3\xa3o'>>> print 'Jo\xc3\xa3o'之間的區別在於前者在對象上調用repr,而後者調用str(或者在您的情況下可能調用unicode)。這只是表示字符串的方式。

一些例子可能會使這個更清晰:

>>> print 'Jo\xc3\xa3o'.decode('utf-8') 
João 
>>> 'Jo\xc3\xa3o'.decode('utf-8') 
u'Jo\xe3o' 
>>> print repr('Jo\xc3\xa3o'.decode('utf-8')) 
u'Jo\xe3o' 

通知第二和第三結果如何是相同的。原來的ldap_username目前是一個ASCII字符串。你可以在Python提示符下看到它:當它顯示一個ACSII對象時,它顯示爲'ASCII string',而Unicode對象顯示爲u'Unicode string' - 關鍵是前導u

所以,你ldap_username讀爲'Jo\xc3\xa3o',並且是一個ASCII字符串,出現以下情況:

>>> 'Jo\xc3\xa3o'.decode('utf-8') 
u'Jo\xe3o' 
>>> print 'Jo\xc3\xa3o'.decode('utf-8') # To Unicode... 
João 
>>> u'João'.encode('utf-8')    # ... back to ASCII 
'Jo\xc3\xa3o' 

概括:你需要確定的字符串類型(使用type不確定時),和基於此,解碼爲Unicode,或編碼爲ASCII。

+0

謝謝jro。儘管我在第二和第三個例子中得到了完全相同的結果,但在您的第一個例子中,我會得到:João,而不是João。 如何獲取存儲在數據庫中的原始值「João」到Python對象中? –

+0

@JoaoFigueiredo:我更新了答案以解決您的其他問題。 – jro

+0

如果我不清楚,我很抱歉。我認爲我掌握瞭解碼和編碼的基本原理(u'string'不會對其類型產生任何疑問)。我的問題仍然是如何將原始字符串傳遞給外部API。 –