2016-07-09 6 views
1

Ich erstelle ein Programm, das. RTF-Dateien lesen wird. RTF-Dateien sind in ASCII codiert, stellen jedoch Nicht-ASCII-Zeichen mit einer Escape-Sequenz dar, gefolgt von zwei Zahlen, die ein UTF-16-Doppelbyte darstellen. Zum Beispiel wird "こ れ は 日本語." Als "\ '82 \ 'b1 \ '82 \' ea \ '82 \ 'cd \ '93 \' fa \ '96 \ '7b \' 8c \ 'ea dargestellt \ '81 \ '42 ".Wie konvertiert man eine Zeichenfolgedarstellung einer UTF-16-Bytefolge in Python in UTF-8?

Für die Zwecke meines Programms ist die Codepage immer "cpg1252".

Wie konvertiere ich die "\ 'xx" -Sequenzen in eine UTF-8-Zeichenfolge? Ich habe versucht, mit den Codecs herumzuspielen, aber alles, was ich bekam, war Kauderwelsch.

+1

RTF verwendet * vorzeichenbehaftete Ganzzahlen *, um UTF-16-Code-Einheiten zu codieren, eigentlich mit dem Präfix "\ u" und gefolgt von einem Ersatzzeichen. –

+0

Es gibt keine Instanzen von "\ u" in meinen .rtf-Dateien. Sind die "\ 'xx" nicht UTF-16? –

+0

Ich bezweifle es. Der Text, den Sie gaben, codiert zu UTF-16-Little-Endian (was alle MS-Produkte verwenden), wäre "53 30 8c 30 6f 30 e5 65 2c 67 9e 8a 02 30". Die Daten, die Sie angegeben haben, haben keine Korrelation damit. –

Antwort

0

Sie scheinen Shift-JIS data innerhalb code-page escapes zu haben; Sie können die markierten Bytes extrahieren und diese dekodieren:

dann decode; Shift-JIS ist Codepage 932 unter Windows:

>>> text = r"\'82\'b1\'82\'ea\'82\'cd\'93\'fa\'96\'7b\'8c\'ea\'81\'42" 
>>> extract_cp_escapes(text) 
'\x82\xb1\x82\xea\x82\xcd\x93\xfa\x96{\x8c\xea\x81B' 
>>> print extract_marked_bytes(text).decode('cp932') 
これは日本語。 

Sie, dass wie UTF-8 zu einem anderen Codec entschlüsseln können, wenn Sie benötigen.

Es kann möglich sein, dass die genaue Codepage auch im RTF-Dokument kodiert ist, aber ich bin nicht mehr in der Lage, das zu recherchieren.

Verwandte Themen