UTF-8, latin-1 Probleme bei der Konvertierung, python django
ok also mein Problem ist, ich habe den string '\222\222\223\225' das gespeichert ist, als latin-1 in die db. Was ich von django (durch den Druck) ist die folgende Zeichenkette, 'ââââ¢', die ich annehmen, ist die UTF-Konvertierung. Jetzt muss ich übergeben Sie den string in eine Funktion, die
funktioniert dieser Vorgang:
strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)
Bekomme ich diesen Fehler:
chr () - arg nicht in range(256)
Wenn ich versuche Kodierung der Zeichenfolge als latin-1 ersten ich bekomme diese Fehlermeldung:
'latin-1' codec can T encode characters in position 0-3: Ordnungszahl nicht
in range(256)
Habe ich gelesen, ein Haufen, wie die Zeichenkodierung funktioniert, und es ist etwas, das ich vermisst werde, weil ich einfach nicht get it!
InformationsquelleAutor jacob | 2008-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre erste Fehler, 'chr () - arg nicht in range(256)' bedeutet wahrscheinlich, dass Sie haben underflowed den Wert, weil chr nicht nehmen negative zahlen. Ich weiß nicht, was der Algorithmus machen soll, wenn die inputcounter + 33 ist mehr als die eigentliche Charakter-Darstellung, die Sie haben zu prüfen, was in diesem Fall zu machen.
Über den zweiten Fehler. Sie müssen decode() und nicht encode() einen regulären string-Objekt, um eine korrekte Darstellung Ihrer Daten. encode() nimmt ein unicode-Objekt (die beginnend mit u') und erzeugt eine regelmäßige Zeichenfolge, die ausgegeben werden oder in eine Datei geschrieben. decode() nimmt einen string-Objekt und erzeugen ein unicode-Objekt mit dem entsprechenden code Punkte. Dies geschieht mit der unicode () - Aufruf, wenn Sie erzeugt aus einem string-Objekt, Sie können auch telefonisch eine.decode('latin-1') statt.
InformationsquelleAutor Vinko Vrsalovic
Als Vinko Noten, Latin-1 oder ISO 8859-1 nicht Darstellbare Zeichen für die oktale Zeichenkette, die Sie zitieren. Nach meinen Notizen für 8859-1, "C1 Controls (0x80 - 0x9F) aus ISO/IEC 6429:1992. Es nicht zu definieren-Namen für 80, 81 oder 99". Die code-point-Namen sind wie Vinko listet Sie auf:
Den korrekten UTF-8-Kodierung von denen ist, die (Unicode, binary, hex):
LATIN SMALL LETTER A WITH CIRCUMFLEX ist ISO 8859-1 code 0xE2 und somit Unicode U+00E2; in UTF-8, %11000011 %10100010 oder 0xC3 0xA2.
CENT-ZEICHEN ISO 8859-1 code 0xA2 und somit Unicode U+00A2; in UTF-8, %11000011 %10000010 oder 0xC3 0x82.
Also, was auch immer sonst Sie zu sehen, Sie scheinen nicht zu sehen, eine UTF-8-Kodierung ISO 8859-1. Alle anderen auseinander, Sie sehen doch 5 bytes wo würden Sie haben, um zu sehen, 8.
Hinzugefügt:
Der Vorherige Teil der Antwort-Adressen, die mit " UTF-8-Codierung Forderung, ignoriert aber den rest der Frage, welche sagt:
Sie nicht wirklich zeigen uns, wie intCounter definiert ist, aber wenn es erhöht sanft pro Charakter, früher oder später '
ord(c) - 3 - intCounter - 30
' ist negativ (und, by the way, warum nicht kombinieren die Konstanten und verwenden Sie 'ord(c) - intCounter - 33
'?), an welchem Punktchr()
ist wahrscheinlich, sich zu beschweren. Sie hätte hinzufügen müssen, 256, wenn der Wert negativ ist, oder verwenden Sie eine modulo-operation, um sicherzustellen, dass Sie einen positiven Wert zwischen 0 und 255 übergebenchr()
. Da wir nicht sehen können, wie intCounter erhöht wird, können wir nicht sagen, ob es Zyklen von 0 bis 255, oder ob es steigt monoton. Wenn das letztere, dann müssen Sie einen Ausdruck wie:wo 256 - 33 = 223, natürlich, und 479 = 256 + 223. Dies garantiert, dass der Wert übergeben
chr()
ist positiv und im Bereich 0..255 zur Eingabe von Zeichen c und einen beliebigen Wert von intCounter (und, weil diemod()
Funktion wird nie ein negatives argument, es funktioniert auch unabhängig davon, wiemod()
verhält, wenn seine Argumente sind negativ).Sieht aus wie ich habe mich mit den ersten Absatz, und der rest nicht. Ich werde das hinzufügen einiger material. Ich glaube, ich sehe ein Problem (nicht unbedingt 'die' Frage, aber....).
InformationsquelleAutor Jonathan Leffler
Gut Ihrer weil seinem wurde verschlüsselt mit einigen schrecklichen Regelung, dass nur änderungen der ord() die Zeichen von einigen verlangen, so dass der string kommt aus der Datenbank verschlüsselt wurde und dieser entschlüsselt es. Was du oben angegeben scheint nicht zu funktionieren. In der Datenbank ist latin-1, django in unicode konvertiert, aber ich konnte nicht übergeben Sie der Funktion als unicode, aber wenn ich versuchen und codieren zu latin-1 sehe ich den Fehler.
und für c in u'\222\222\223\225': print chr(ord(c) - 33) auch funktioniert. Es funktioniert auch mit string-Objekten.
InformationsquelleAutor jacob