Cyrillic Decoder dari dikutip-cetak

Selamat siang teman-teman! Saya menemukan diri saya tugas yang menghibur untuk waktu dekat, saya memutuskan untuk menulis "dialer" untuk Android. Aplikasi akan disinkronkan dengan kontak di sistem dan melakukan tindakan tertentu. Apa yang dikutip-cetak berhubungan dengan apa itu dan mengapa saya membutuhkannya - saya katakan dalam artikel.


Jadi dikutip-cetak adalah sistem pengkodean teks biner ke dalam teks menggunakan karakter ASCII yang dapat dicetak, dan dilihat dari halaman dalam Wikipedia versi bahasa Inggris, ini digunakan untuk menyandikan / mendekode data dalam pesan email.


Sebenarnya, ini tidak sepenuhnya benar. Ada format file seperti itu - vCard. Dan dalam format ini kontak-kontak diimpor / diekspor dari smartphone Android apa pun. Jadi, format ini (dengan ekstensi .vcf) dalam versi 2.1 juga menggunakan enkode yang dikutip-cetak. Alfabet Cyrillic dalam pengkodean ini memiliki bentuk (contoh): "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82" , mis. pertama, setiap karakter Cyrillic dikodekan dalam UTF-8 ke dalam urutan dua byte, dan kemudian setiap byte ditulis dalam representasi hex dengan tanda sama dengan "=".


Dan dalam formulir ini, semua kontak dengan karakter Cyrillic diimpor. Jelas bahwa tidak ada masalah membaca dan mengedit file. Dan itulah yang saya butuhkan. Saya mencoba melalui plugin di editor teks ... Anda dapat mengatasi masalah ini, ya, tetapi ada terlalu banyak manipulasi. Singkatnya, saya harus duduk untuk menulis dekoder.


Dalam prosesnya, saya bertemu dengan hambatan lain. Faktanya adalah bahwa standar pengkodean yang dikutip-cetak memberikan garis panjang maksimum 75 karakter, dan kemudian membuat tanda hubung, menduplikasi karakter "=". Butuh fungsi tambahan untuk menggabungkan garis yang dibungkus.


Script menggunakan modul quopri (saya mengimpor segera, tanpa instalasi).


 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')) 

Hasil skrip. Dari garis-garis bentuk:


 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 

Kami mendapatkan:


 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 

Setelah mengedit file, jika perlu, kami melakukan penyandian balik:


 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) 

Dalam hal ini, pada kenyataannya, seseorang dapat menyelesaikan, tetapi ada satu lagi sebuah lelucon hal. Saya menemukan garis-garis yang dikodekan dalam kutip-dicetak anehnya mirip dengan beberapa url yang mungkin ditemui semua orang di bilah alamat browser, hanya alih-alih tanda "=" dengan tanda "%". Lihat (contoh) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" . Dan apa yang akan Anda pikirkan? Ya, ya Rupanya ini juga dikutip-cetak (Anda harus meminta master html). Semuanya diterjemahkan ke dalam alfabet Cyrillic seperti yang dijelaskan di atas, asalkan "%" diganti dengan "=".


Oh ya Saya benar-benar lupa. Jika tiba-tiba seseorang membutuhkannya, maka karakter Cina dan huruf Arab diterjemahkan dengan cara yang sama seperti karakter Cyrillic (diperiksa secara pribadi).


Yah, itu saja, teman-teman, selamat tinggal, mungkin itu akan sedikit berguna bagi pekerjaanku.

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


All Articles