cx_Oracle - Codierung Abfrage-Ergebnis zu Raw
EDIT:
Folgende Bild zeigt mein soll-Wert.
(beide sys.stdout.Codierung und sys.stdin.encoding 'UTF-8').
Warum ist der Wert der Variablen anders als Ihre print Wert? Ich brauche die roh-Wert in eine variable.
>>username = 'Jo\xc3\xa3o'
>>username.decode('utf-8').encode('latin-1')
'Jo\xe3o'
>>print username.decode('utf-8').encode('latin-1')
João
Ursprünglichen Frage:
Ich habe ein Problem das Abfragen einer BD und Dekodierung der Werte in Python.
Bestätigte ich die DB von NLS_LANG mit
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()
...
wo
print ldap_username
>>'Jo\xc3\xa3o'
Ich habe beide ausprobiert (wieder den gleichen)
ldap_username.decode('utf-8')
>>u'Jo\xe3o'
unicode(ldap_username, 'utf-8')
>>u'Jo\xe3o'
wo
u'João'.encode('utf-8')
>>'Jo\xc3\xa3o'
wie man die Abfragen führen zurück auf die richtige 'João' ?
InformationsquelleAutor Joao Figueiredo | 2011-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie schon die richtigen "João', dünkt mich. Der Unterschied zwischen
>>> 'Jo\xc3\xa3o'
und>>> print 'Jo\xc3\xa3o'
ist, dass die früheren Anruferepr
auf das Objekt, während die letzteren nenntstr
(oder wahrscheinlichunicode
in deinem Fall). Es ist einfach wie die Zeichenfolge ist vertreten.Einige Beispiele machen dies klar:
Beachten Sie, wie die zweite und Dritte Ergebnis sind identisch. Die original
ldap_username
derzeit ist eine ASCII-Zeichenfolge. Sie sehen diese auf der Python-Eingabeaufforderung ein: wenn es zeigt eine ACSII-Objekt, es zeigt, wie'ASCII string'
, während Unicode-Objekte werden gezeigt, wieu'Unicode string'
- der Schlüssel zu den führendenu
.So, wie Ihr
ldap_username
liest sich wie'Jo\xc3\xa3o'
, und ist eine ASCII-Zeichenkette, gilt Folgendes:Zusammengefasst: Sie brauchen, um zu bestimmen, den Typ der saite (verwenden
type
wenn Sie unsicher sind), und basierend darauf, decode Unicode, oder encode to ASCII.Ich aktualisierte die Antwort auf Ihre weitere Frage.
Ich entschuldige mich, wenn ich nicht klar. Ich denke, ich packte die Grundlagen der Kodierung und Dekodierung (u'string' hinterlässt keine Zweifel über seine Art). Mein Problem bleibt, wie Sie passieren die raw-string an eine externe API.
Als vorübergehende Lösung, ich bin Normalisierung der Saiten, unicodedata.normalize('NFKD', ldap_username.decode('utf-8') ).encode('ascii', 'ignore'), die normalisiert 'João' , 'Joao', 'Lourenço' zu 'Lourenco', etc
Ich bin mir nicht sicher, was das problem ist. Sie Fragen, warum "die variable Wert [ist], anders als sein print-Wert": das ist einfach der Unterschied in der Repräsentation der gleichen Zeichenfolge.
str
druckt den string in einem "pretty" format;repr
druckt den string in ein format, das verwendet werden kann, um zu rekonstruieren, das Objekt (miteval
). Führen Sie die folgenden Befehle ein, vielleicht klärt die Sache auf:repr('Jo\xc3\xa3o')
,eval('Jo\xc3\xa3o')
,eval(repr('Jo\xc3\xa3o'))
. Schließlich, wie für die Ausgabe von der externen API, ich bräuchte ein paar Fehlermeldungen sagen nichts über es.InformationsquelleAutor jro