Utf-8-Codierung mit doppeltem Schrägstrich konvertieren

Ich kann das nicht zum Laufen bringen! Ich habe eine Textdatei aus einem Parser zum Speichern von Spieldateien mit einer Reihe von chinesischen UTF-8-Namen in Byte-Form, wie in der Datei source.txt:

\ xe6 \ x89 \ x8e \ xe5 \ x8a \ xa0 \ xe6 \ x8b \ x89

Aber egal wie ich es in Python (3 oder 2) importiere, ich bekomme diesen String bestenfalls:

\\ xe6 \\ x89 \\ x8e \\ xe5 \\ x8a \\ xa0 \\ xe6 \\ x8b \\ x89

Ich habe versucht, wie andere Threads vorgeschlagen haben, den String als UTF-8 neu zu kodieren und ihn dann mit Unicode-Escape zu dekodieren, wie folgt:

stringName.encode("utf-8").decode("unicode_escape")

Aber dann wird die ursprüngliche Codierung durcheinander gebracht und als Zeichenfolge ausgegeben:

'æ \ x89 \ x8eå \ x8a \ xa0æ \ x8b \ x89' (Drucken dieser Zeichenfolge führt zu: æå æ)

Now, wenn ich b + die Originalzeichenfolge manuell in den Dateinamen kopiere und einfüge und diese codiere, erhalte ich die richtige Codierung. Beispielsweise

b'\xe6\x89\x8e\xe5\x8a\xa0\xe6\x8b\x89'.encode("utf-8")

Ergebnisse in: '扎加拉'

Aber ich kann das nicht programmatisch machen. Ich kann nicht einmal die doppelten Schrägstriche loswerden.

Um klar zu sein, enthält source.txt einzelne Backslashes. Ich habe versucht, es auf viele Arten zu importieren, aber dies ist die häufigste:

with open('source.txt','r',encoding='utf-8') as f_open:
    source = f_open.read()

Okay, also habe ich auf die Antwort unten geklickt (glaube ich), aber hier ist, was funktioniert:

from ast import literal_eval
decodedString = literal_eval("b'{}'".format(stringVariable)).decode('utf-8')

Ich kann es aufgrund anderer Kodierungsprobleme nicht für die gesamte Datei verwenden, aber jeden Namen als String (stringVariable) extrahieren und das funktioniert dann! Vielen Dank

Um dies noch deutlicher zu machen, handelt es sich bei der Originaldatei nicht nur um diese durcheinandergebrachten UTF-Codierungen. Sie werden nur für bestimmte Felder verwendet. Hier ist zum Beispiel der Anfang der Datei:

{'m_cacheHandles': ['s2ma\x00\x00CN\x1f\x1b"\x8d\xdb\x1fr \\\xbf\xd4D\x05R\x87\x10\x0b\x0f9\x95\x9b\xe8\x16T\x81b\xe4\x08\x1e\xa8U\x11',
                's2ma\x00\x00CN\x1a\xd9L\x12n\xb9\x8aL\x1d\xe7\xb8\xe6\xf8\xaa\xa1S\xdb\xa5+\t\xd3\x82^\x0c\x89\xdb\xc5\x82\x8d\xb7\x0fv',
                's2ma\x00\x00CN\x92\xd8\x17D\xc1D\x1b\xf6(\xedj\xb7\xe9\xd1\x94\x85\xc8`\x91M\x8btZ\x91\xf65\x1f\xf9\xdc\xd4\xe6\xbb',
                's2ma\x00\x00CN\xa1\xe9\xab\xcd?\xd2PS\xc9\x03\xab\x13R\xa6\x85u7(K2\x9d\x08\xb8k+\xe2\xdeI\xc3\xab\x7fC',
                's2ma\x00\x00CNN\xa5\xe7\xaf\xa0\x84\xe5\xbc\xe9HX\xb93S*sj\xe3\xf8\xe7\x84`\xf1Ye\x15~\xb93\x1f\xc90',
                's2ma\x00\x00CN8\xc6\x13F\x19\x1f\x97AH\xfa\x81m\xac\xc9\xa6\xa8\x90s\xfdd\x06\rL]z\xbb\x15\xdcI\x93\xd3V'],
'm_campaignIndex': 0,
'm_defaultDifficulty': 7,
'm_description': '',
'm_difficulty': '',
'm_gameSpeed': 4,
'm_imageFilePath': '',
'm_isBlizzardMap': True,
'm_mapFileName': '',
'm_miniSave': False,
'm_modPaths': None,
'm_playerList': [{'m_color': {'m_a': 255, 'm_b': 255, 'm_g': 92,   'm_r': 36},
               'm_control': 2,
               'm_handicap': 0,
               'm_hero': '\xe6\x89\x8e\xe5\x8a\xa0\xe6\x8b\x89',

Alle Informationen vor dem Feld 'm_hero': sind nicht utf-8. Die Verwendung der ShadowRanger-Lösung funktioniert also, wenn die Datei nur aus diesen gefälschten utf-Codierungen besteht, aber nicht, wenn ich m_hero bereits als Zeichenfolge analysiert habe und versuche, diese zu konvertieren. Karins Lösung funktioniert dafür.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage