Kyrillischer Decoder von quoted-printable

Guten Tag, Freunde! Ich fand mich einer unterhaltsamen Aufgabe für die nahe Zukunft gegenüber und entschied mich, einen "Dialer" für Android zu schreiben. Die Anwendung wird mit den Kontakten im System synchronisiert und führt bestimmte Aktionen aus. Was bedeutet, dass Quoted-Printable damit zu tun hat, was es ist und warum ich es brauchte - das verrate ich im Artikel.


So ist Quoted-Printable ein System zum Codieren von binärem Text in Text mit druckbaren ASCII-Zeichen. Gemäss der englischen Wikipedia-Version wird es zum Codieren / Decodieren von Daten in E-Mail-Nachrichten verwendet.


In der Tat ist dies nicht ganz richtig. Es gibt ein solches Dateiformat - vCard. In diesem Format werden Kontakte von jedem Android-Smartphone importiert / exportiert. Daher wird in diesem Format (mit der Erweiterung .vcf) in Version 2.1 auch die Codierung "quoted-printable" verwendet. Das kyrillische Alphabet in dieser Codierung hat die Form (Beispiel): "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82" , d.h. Zunächst wird jedes kyrillische Zeichen in UTF-8 in eine Folge von zwei Bytes codiert. Anschließend wird jedes Byte in hexadezimaler Darstellung mit dem Vorzeichen "=" geschrieben.


In diesem Formular werden alle Kontakte mit kyrillischen Zeichen importiert. Es ist klar, dass es keine Frage des Lesens und Bearbeitens einer Datei gibt. Und genau das brauche ich. Ich habe Plugins in Texteditoren ausprobiert ... Sie können dieses Problem lösen, aber es gibt zu viele Manipulationen. Kurz gesagt, ich musste mich hinsetzen, um einen Decoder zu schreiben.


Dabei bin ich auf einen anderen Haken gestoßen. Tatsache ist, dass der in Anführungszeichen gesetzte druckbare Kodierungsstandard Zeilen mit einer maximalen Länge von 75 Zeichen bereitstellt und dann Bindestriche erstellt, wobei die Zeichen "=" dupliziert werden. Es erforderte eine zusätzliche Funktion, um die umbrochenen Zeilen zu kombinieren.


Das Skript verwendet das quopri-Modul (ich habe es sofort ohne Installation importiert).


 import quopri import os List_contact = [] File = ".vcf" with open (File) as file: #     for i in file: List_contact.append (i) #      def Func (List_for_change): List_contact_1 = [] for i in List_contact: if i[-2] == '=': List_contact_1.append (i[:-2]) else: List_contact_1.append (i) with open ('File.txt', 'w') as file: for i in List_contact_1: file.write (i) List_contact_1 = [] with open ('File.txt') as file: for i in file: List_contact_1.append (i) os.unlink ('File.txt') #  temp  return (List_contact_1) List_contact = Func (List_contact) #     with open ('Contacts_Decode.txt', 'w') as file: for i in List_contact: Str_1 = bytes (i, 'UTF-8') #  quopri      Str_2 = quopri.decodestring (Str_1) file.write (Str_2.decode ('UTF-8')) 

Das Ergebnis des Skripts. Aus den Zeilen des Formulars:


 BEGIN:VCARD VERSION:2.1 N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=90=D0=BD=D0=B4=D1=80=D0= =B5=D0=B9;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=90=D0=BD=D0=B4=D1=80=D0= =B5=D0=B9 TEL;CELL;PREF:80000000000 END:VCARD BEGIN:VCARD VERSION:2.1 N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=92=D0=B8=D0=BA=D1=82=D0= =BE=D1=80 =D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B5=D0=B2=D0=B8=D1=87;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=B8=D0=BA=D1=82=D0= =BE=D1=80 =D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B5=D0=B2=D0=B8=D1=87 TEL;CELL;PREF:80000000000 END:VCARD 

Wir bekommen:


 BEGIN:VCARD VERSION:2.1 N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE: TEL;CELL;PREF:80000000000 END:VCARD BEGIN:VCARD VERSION:2.1 N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:; ;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:  TEL;CELL;PREF:80000000000 END:VCARD 

Nach der Bearbeitung der Datei führen wir gegebenenfalls die umgekehrte Codierung durch:


 List_contact_2 = [] with open('Contacts_Decode.txt') as file: for i in file: List_contact_2.append(i) with open('_New.vcf', 'w') as file: for i in List_contact_2: Str_1 = bytes(i, 'UTF-8') Str_2 = quopri.encodestring(Str_1) Str_3 = Str_2.decode('UTF-8') # quopri   "="  hex- "=3D",     Str_4 = Str_3.replace('=3D','=') file.write(Str_4) 

Damit könnte man zwar fertig werden, aber es gibt noch einen ein Witz was. Ich fand die in quoted-printable codierten Zeilen seltsamerweise ähnlich wie einige URLs, die wahrscheinlich jeder in der Adressleiste des Browsers fand, nur anstelle des "=" - Zeichens mit dem "%" - Zeichen. Siehe (Beispiel) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" . Und was denkst du? Ja Ja. Anscheinend ist dies auch druckbar (Sie müssen HTML-Meister fragen). Alles wird wie oben beschrieben in das kyrillische Alphabet decodiert, vorausgesetzt, "%" wird durch "=" ersetzt.


Oh ja Ich habe völlig vergessen. Wenn es plötzlich jemand braucht, werden die chinesischen Zeichen und arabischen Buchstaben wie kyrillische Zeichen dekodiert (persönlich überprüft).


Nun, das ist alles, Freunde, auf Wiedersehen, vielleicht nützt es meiner Arbeit wenig.

Source: https://habr.com/ru/post/de475780/


All Articles