उद्धृत-मुद्रण योग्य से सिरिलिक विकोडक

शुभ दिन, दोस्तों! मैंने खुद को निकट भविष्य के लिए एक मनोरंजक कार्य पाया, मैंने एंड्रॉइड के लिए "डायलर" लिखने का फैसला किया। एप्लिकेशन सिस्टम में संपर्कों के साथ सिंक्रनाइज़ करेगा और कुछ क्रियाएं करेगा। क्या उद्धृत-प्रिंट करने योग्य है इसका क्या है और मुझे इसकी आवश्यकता क्यों है - मैं लेख में बताता हूं।


इसलिए उद्धृत-प्रिंट करने योग्य मुद्रण योग्य ASCII वर्णों का उपयोग करके पाठ में द्विआधारी पाठ को एन्कोडिंग करने की एक प्रणाली है, और विकिपीडिया के अंग्रेजी संस्करण में पृष्ठ को देखते हुए , इसका उपयोग ई-मेल संदेशों में डेटा को एनकोड / डिकोड करने के लिए किया जाता है।


वास्तव में, यह पूरी तरह से सच नहीं है। ऐसा एक फ़ाइल प्रारूप है - vCard। और यह इस प्रारूप में है कि किसी भी एंड्रॉइड स्मार्टफोन से संपर्क आयात / निर्यात किए जाते हैं। तो, संस्करण 2.1 में यह प्रारूप (एक्सटेंशन .vcf के साथ) भी उद्धृत-मुद्रण योग्य एन्कोडिंग का उपयोग करता है। इस एन्कोडिंग में सिरिलिक वर्णमाला का रूप (उदाहरण) है: "=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82" , i.e. सबसे पहले, प्रत्येक सिरिलिक वर्ण को UTF-8 में दो बाइट्स के अनुक्रम में एन्कोड किया गया है, और फिर प्रत्येक बाइट को "=" के बराबर चिह्न के साथ हेक्स प्रतिनिधित्व में लिखा गया है।


और इस रूप में, सिरिलिक पात्रों के साथ सभी संपर्क आयात किए जाते हैं। यह स्पष्ट है कि किसी फ़ाइल को पढ़ने और संपादित करने का कोई सवाल ही नहीं है। और यह वही है जो मुझे चाहिए। मैंने पाठ संपादकों में प्लगइन्स के माध्यम से कोशिश की ... आप इस समस्या को हल कर सकते हैं, हां, लेकिन बहुत सारे जोड़तोड़ भी हैं। संक्षेप में, मुझे डिकोडर लिखने के लिए बैठना पड़ा।


इस प्रक्रिया में, मैं दूसरे स्नैग में भाग गया। तथ्य यह है कि उद्धृत-मुद्रण योग्य एन्कोडिंग मानक 75 वर्णों की अधिकतम लंबाई की रेखाएं प्रदान करता है, और फिर वर्णों को दोहराता है, "="। लिपटे लाइनों को संयोजित करने के लिए एक अतिरिक्त कार्य किया।


स्क्रिप्ट क्वोप्री मॉड्यूल का उपयोग करती है (मैं स्थापना के बिना तुरंत आयात किया गया)।


 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) 

इस पर, वास्तव में, कोई भी खत्म कर सकता था, लेकिन एक और भी है एक मजाक बात। मैंने पाया कि कुछ-कुछ उरोजों के समान अजीब-से-प्रिंट किए गए लाइनों को इनकोड किया गया है, जो शायद सभी को ब्राउज़र के एड्रेस बार में मिलते हैं, केवल "=" साइन के बजाय "%" साइन के साथ। देखें (उदाहरण) "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82" । और आप क्या सोचेंगे? हाँ, हाँ। जाहिरा तौर पर यह भी उद्धृत-प्रिंट करने योग्य है (आपको html-स्वामी से पूछने की आवश्यकता होगी)। जैसा कि ऊपर वर्णित है, सब कुछ सिरिलिक वर्णमाला में डिकोड किया गया है, बशर्ते कि "%" को "=" द्वारा बदल दिया जाए।


अरे हाँ। मैं पूरी तरह से भूल गया। यदि अचानक किसी को इसकी आवश्यकता होती है, तो चीनी अक्षरों और अरबी अक्षरों को उसी तरह से डिकोड किया जाता है जैसे कि सिरिलिक वर्ण (व्यक्तिगत रूप से जांचा गया)।


खैर, यह सब, दोस्तों, अलविदा, शायद यह मेरे मजदूरों के लिए बहुत कम काम आएगा।

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


All Articles