Decodificador cirílico de imprimible citado

Buen dia amigos! Me encontré una tarea entretenida para el futuro cercano, decidí escribir un "marcador" para Android. La aplicación se sincronizará con los contactos en el sistema y realizará ciertas acciones. ¿Qué tiene que ver citado-imprimible tiene que ver con lo que es y por qué lo necesitaba? Lo digo en el artículo.


Entonces, citado-imprimible es un sistema de codificación de texto binario en texto utilizando caracteres ASCII imprimibles, y a juzgar por la página en la versión inglesa de Wikipedia, se utiliza para codificar / decodificar datos en mensajes de correo electrónico.


De hecho, esto no es del todo cierto. Existe dicho formato de archivo: vCard. Y es en este formato que los contactos se importan / exportan desde cualquier teléfono inteligente Android. Entonces, este formato (con la extensión .vcf) en la versión 2.1 también usa codificación imprimible entre comillas. El alfabeto cirílico en esta codificación tiene la forma (ejemplo): "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82" , es decir primero, cada carácter cirílico se codifica en UTF-8 en una secuencia de dos bytes, y luego cada byte se escribe en la representación hexadecimal con el signo igual a "=".


Y de esta forma, se importan todos los contactos con caracteres cirílicos. Está claro que no se trata de leer y editar un archivo. Y eso es exactamente lo que necesito. Lo intenté a través de complementos en editores de texto ... Puede resolver este problema, sí, pero hay demasiadas manipulaciones. En resumen, tuve que sentarme para escribir un decodificador.


En el proceso, me encontré con otro inconveniente. El hecho es que el estándar de codificación imprimible entre comillas proporciona líneas de longitud máxima de 75 caracteres, y luego hace guiones, duplicando los caracteres "=". Tomó una función adicional para combinar las líneas envueltas.


El script usa el módulo quopri (importé de inmediato, sin instalación).


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

El resultado del guión. De las líneas del formulario:


 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 

Obtenemos:


 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 

Después de editar el archivo, si es necesario, realizamos la codificación inversa:


 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) 

En esto, de hecho, uno podría terminar, pero hay uno más una broma cosa Las líneas codificadas en imprimible entre comillas me parecieron extrañamente similares a algunas URL que probablemente todos conocieron en la barra de direcciones del navegador, solo en lugar del signo "=" con el signo "%". Ver (ejemplo) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" . ¿Y qué pensarías? Si si. Aparentemente, esto también se imprime entre comillas (deberá preguntar a html-masters). Todo se decodifica en el alfabeto cirílico como se describió anteriormente, siempre que "%" se reemplace por "=".


Oh si Lo olvidé por completo. Si de repente alguien lo necesita, entonces los caracteres chinos y las letras árabes se decodifican de la misma manera que los caracteres cirílicos (revisados ​​personalmente).


Bueno, eso es todo, amigos, adiós, tal vez será de poca utilidad para mi trabajo.

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


All Articles