2017-05-31 7 views
0

Ich benutze xmlcharrefreplace, um nicht standardisierte Zeichen in einer Zeichenfolge zu ersetzen, so dass es in einer XML-Datei gespeichert werden kann. Später möchte ich diese Zeichenfolge wieder in die ursprünglichen Zeichen konvertieren.Python string encoding xmlcharrefreplace decode

import openpyxl 
import cgi 
from html.parser import HTMLParser 
parser = HTMLParser() 

startingString = "Tỉnh Đồng Nai" #example string 
print("Starting string: " + startingString) #Starting string: Tỉnh Đồng Nai 

# 1. This string contains non-standard characters. Convert these characters using xmlcharrefreplace 
escapedString = cgi.escape(startingString) 
strEscapedString = str(escapedString) 
aposString = strEscapedString.replace("'", "'") 
savedToExcelString = str(aposString.encode('utf-8', 'xmlcharrefreplace'))[2:-1] 

print("xmlcharrefreplace converted to: " + savedToExcelString) #xmlcharrefreplace converted to: T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai 

# 2. The string is saved to an xml file 
# 3. The string is read from an xml file 

# 4. Convert the string back into the original starting string 
unescapedString = parser.unescape(savedToExcelString) 
#what do I do here??? I need to 'undo' the xmlcharrefreplace encoding 

print(startingString + " == " + unescapedString + " is " + str(startingString == unescapedString)) 
# Tỉnh Đồng Nai == T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai is False 
# ^^ Should be the same string at the end 

Bitte beachte, dass ich nicht codecs.open() verwenden, weil ich die Bibliothek openpyxl bin mit einer Excel-Datei als auch die Daten enthält, zu öffnen. Es gibt keine Beschränkungen für den Zeichensatz, den die Eingabe haben könnte - Ich möchte, dass die letzte Zeichenfolge mit der ursprünglichen Zeichenfolge übereinstimmt.

Ziel: Konvertieren von Zeichen aus xmlcharrefreplace zurück in ihr Skriptzeichen. Zum Beispiel: "\ x90" wird "ồ"

Antwort

0

Was Sie beschrieben haben, ist nicht möglich, im Allgemeinen. Wenn Sie von einem großen Zeichensatz (irgendetwas) in einen kleineren konvertieren, verlieren Sie Informationen. Solange Sie keine Einschränkungen für das codierte Ergebnis haben, haben Sie keine Möglichkeit, etwas zu codieren, das Sie rückgängig machen können.

Wenn Sie jedoch eine Vereinbarung mit der Datenbank über Tags haben, die in der Eingabe nicht erscheinen (wie die Zeichenfolge "\ x"), können Sie einen oder mehrere von denen verwenden, um einen Code anzugeben Zeichenfolge, und Sie können den Code erstellen, den Sie in dieser Region mögen. Beachten Sie beispielsweise, wie die Beispieleingabe später als "T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai" angezeigt wird.

Wenn dies für Sie funktioniert, schlage ich vor, dass Sie eine Eins-zu-eins-Zuordnung erstellen, in einem Wörterbuch (und umgekehrt) gespeichert und das Wörterbuch einfach in beide Richtungen im kritischen Schritt indizieren. Ich gehe davon aus, dass Sie die Erkennungslogik (Nicht-ASCII-Zeichen beim Verschlüsseln; markierte Sequenz beim Decodieren) selbst handhaben können.

+0

Danke, das ist die richtige Antwort. Leider funktioniert die Wörterbuchzuordnungsidee nicht mit dieser Programmarchitektur. –