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