引用印刷的西里尔文解码器

朋友们,美好的一天! 在不久的将来,我发现自己是一个有趣的难题,我决定为Android编写“拨号程序”。 该应用程序将与系统中的联系人同步并执行某些操作。 quoted-printable的作用和它的含义以及我为什么需要它有关-我在文章中讲述。


因此,quoted-printable是一个使用可打印的ASCII字符将二进制文本编码为文本,并根据Wikipedia英文版中页面进行判断的系统,它用于对电子邮件中的数据进行编码/解码。


实际上,这并非完全正确。 有这样的文件格式-vCard。 并以这种格式从任何Android智能手机导入/导出联系人。 因此,2.1版中的这种格式(扩展名为.vcf)也使用带引号的可打印编码。 这种编码的西里尔字母的形式为(示例): "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82" ,即 首先,每个西里尔字母都以UTF-8编码为两个字节的序列,然后每个字节以十六进制表示形式写入,其符号等于“ =”。


并以这种形式导入所有带有西里尔字母的联系人。 显然,没有读取和编辑文件的问题。 这正是我所需要的。 我尝试通过文本编辑器中的插件...是的,您可以解决此问题,但是操作过多。 简而言之,我不得不坐下来编写解码器。


在此过程中,我遇到了另一个障碍。 事实是,带引号的可打印编码标准提供最大长度为75个字符的行,然后加上连字符,复制字符“ =”。 花了一个附加功能来组合换行。


该脚本使用quopri模块(我立即导入,未安装)。


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

脚本的结果。 从表格的行:


 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 

我们得到:


 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 

编辑文件后,如有必要,我们执行反向编码:


 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) 

实际上,就此而言,可以完成,但还有更多 开个玩笑 的东西。 我发现用quoted-printable编码的行奇怪地类似于每个人可能在浏览器地址栏中遇到的某些URL,只是代替了带有“%”号的“ =”号。 查看(示例) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" 。 你会怎么想? 是的是的 显然,这也是引用可打印的(您将需要询问html-masters)。 如上所述,只要将“%”替换为“ =”,所有内容都会解码为西里尔字母。


哦是的 我完全忘记了 如果您突然需要某人,则中文字符和阿拉伯字母的解码方式与西里尔字母(个人检查)相同。


好吧,朋友,再见,也许这对我的工作没有多大用处。

Source: https://habr.com/ru/post/zh-CN475780/


All Articles