السيريلية فك من اقتباس قابلة للطباعة

يوم جيد يا اصدقاء! لقد وجدت نفسي مهمة مسلية في المستقبل القريب ، قررت أن أكتب "طالب" لنظام Android. سيقوم التطبيق بالتزامن مع جهات الاتصال في النظام وتنفيذ إجراءات معينة. ما علاقة النص المطبوع به علاقة بما هو عليه ولماذا احتجت إليه - أقول في المقال.


لذا ، فإن نظام علامات الاقتباس القابل للطباعة هو نظام لتشفير النص الثنائي في نص باستخدام أحرف ASCII القابلة للطباعة ، وإذا حكمنا من خلال الصفحة في النسخة الإنجليزية من ويكيبيديا ، فإنه يستخدم لتشفير / فك شفرة البيانات في رسائل البريد الإلكتروني.


في الواقع ، هذا ليس صحيحا تماما. هناك مثل هذا الملف - vCard. ويتم في هذا التنسيق استيراد / تصدير جهات الاتصال من أي هاتف ذكي يعمل بنظام Android. لذلك ، يستخدم هذا التنسيق (بالملحق .vcf) في الإصدار 2.1 أيضًا الترميز القابل للطباعة. تحتوي الأبجدية السيريلية في هذا الترميز على النموذج (مثال): "=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) 

في هذا ، في الواقع ، يمكن للمرء أن ينتهي ، ولكن هناك واحد آخر مزحة الشيء. لقد وجدت أن الأسطر المشفرة في علامات اقتباس قابلة للطباعة تشبه بشكل غريب بعض عناوين url التي ربما قابلها الجميع في شريط عنوان المتصفح ، فقط بدلاً من علامة "=" مع علامة "٪". عرض (مثال) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" . وما رأيك؟ نعم نعم يبدو أن هذا قابل للطباعة أيضًا (ستحتاج إلى سؤال html-masters). يتم فك تشفير كل شيء في الأبجدية السيريلية كما هو موضح أعلاه ، شريطة أن يتم استبدال "٪" بـ "=".


اوه نعم لقد نسيت تماما. إذا كنت بحاجة إلى شخص ما فجأة ، فسيتم تشفير الأحرف الصينية والحروف العربية بنفس الطريقة التي يتم بها فك رموز الأحرف السيريلية (محددة شخصياً).


حسنًا ، هذا كل شيء ، أيها الأصدقاء ، وداعًا ، ربما لن يكون ذا فائدة تذكر لأعمالي.

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


All Articles