cx_Oracle - кодирование результата запроса в Raw - PullRequest
2 голосов
/ 21 октября 2011

РЕДАКТИРОВАТЬ:

Следующая печать показывает мое предполагаемое значение.

(как 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.

Я подтвердил свою базу данных 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/%s@%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 Ответ

2 голосов
/ 24 октября 2011

У вас уже есть подходящее «Жуан», метинкс.Разница между >>> '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.

...