हिन्दी

टेक्स्ट और रोजमर्रा के टूल · टेक्स्ट टूलकिट

अदृश्य पात्र: न टूटने वाले स्थान, शून्य-चौड़ाई वाले जोड़ और ट्रिम

· पेजभूमि

पाठ-सफाई यूनिकोड प्रकाशित करना

छुपे हुए स्थानों और शून्य-चौड़ाई वाले यूनिकोड वर्णों को प्रकट करने वाली दृश्यमान पाठ पंक्तियाँ
मूल ToolAcre वेक्टर चित्रण

उन पात्रों का सर्वेक्षण करता है जो कुछ भी नहीं दिखते हैं - गैर-ब्रेकिंग रिक्त स्थान, शून्य-चौड़ाई वाले रिक्त स्थान और जॉइनर्स, बाइट ऑर्डर चिह्न - वे कहां से आते हैं, जो व्हाइटस्पेस के रूप में गिने जाते हैं, और उन्हें कैसे ढूंढें और हटाएं।

दो समान पंक्तियाँ जो डुप्लिकेट नहीं हैं - कैसे एक अदृश्य चरित्र डी-डुप्लीकेशन और खोज को हरा देता है

एक एडिटर में दो पंक्तियाँ समान दिख सकती हैं फिर भी समानता, खोज या डी-डुप्लीकेशन जाँच में विफल रहती हैं। एक में सामान्य U+0020 स्थान हो सकता है जबकि दूसरे में U+00A0, एक गैर-ब्रेकिंग स्थान हो सकता है। एक शून्य-चौड़ाई वाला वर्ण किसी भी दृश्य चौड़ाई पर कब्जा किए बिना एक ही समस्या पैदा कर सकता है, जिससे एक प्रकाशक के पास दो स्पष्ट रूप से मेल खाने वाले लेबल रह जाते हैं जो अलग-अलग स्ट्रिंग बने रहते हैं।

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

वे कहां से आते हैं - वेब पेज, वर्ड प्रोसेसर, इमोजी अनुक्रम और PDF से कॉपी-पेस्ट

अदृश्य पात्र आमतौर पर सामान्य कार्य के माध्यम से आते हैं। वेब पेज शब्दों को एक साथ रखने के लिए नॉन-ब्रेकिंग स्पेस का उपयोग करते हैं, वर्ड प्रोसेसर लेआउट-उन्मुख रिक्ति को संरक्षित करते हैं, और PDF निष्कर्षण स्थित ग्लिफ़ से टेक्स्ट का पुनर्निर्माण करता है। उन प्रणालियों के बीच प्रतिलिपि बनाने से फ़ॉर्मेटिंग वर्णों को CMS फ़ील्ड में ले जाया जा सकता है, तब भी जब गंतव्य केवल परिचित शब्द और अंतराल प्रदर्शित करता है।

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

व्हाइटस्पेस परिवार - सामान्य, गैर-टूटने वाला, संकीर्ण और वैचारिक स्थान, और JavaScript का ट्रिम व्हाइटस्पेस को क्या मानता है

यूनिकोड में रोजमर्रा की जगह से कहीं अधिक जगह होती है। U+00A0 नॉन-ब्रेकिंग स्पेस है, U+202F संकीर्ण नॉन-ब्रेकिंग स्पेस है, और U+3000 वैचारिक स्पेस है। JavaScript व्हाइटस्पेस हैंडलिंग में ये वर्ण शामिल हैं, इसलिए `trim()`, `trimStart()` और `trimEnd()` जब वे स्ट्रिंग के प्रासंगिक किनारे पर होते हैं तो उन्हें हटा सकते हैं।

टेक्स्ट टूलकिट की लाइन ट्रिमिंग प्रत्येक पंक्ति पर उन JavaScript विधियों को कॉल करती है। यह आंतरिक रिक्ति को सामान्य नहीं करता है, इसलिए दो शब्दों के बीच एक न टूटने वाला स्थान बना रहता है। इसका "रिक्त स्थान के बिना वर्ण" आँकड़ा JavaScript `s` से मेल खाने वाले वर्णों को हटा देता है, जो ASCII स्थान से अधिक व्यापक है। उस संख्या को एक परिभाषित माप के रूप में उपयोग करें, न कि एक वादे के रूप में कि प्रत्येक अदृश्य कोड बिंदु को बाहर रखा गया था।

शून्य-चौड़ाई परिवार - शून्य-चौड़ाई वाला स्थान, जॉइनर और नॉन-जॉइनर, वर्ड जॉइनर और बाइट ऑर्डर मार्क, जो बिल्कुल भी व्हाइटस्पेस नहीं हैं

शून्य-चौड़ाई वाला परिवार विभिन्न नियमों का पालन करता है। U+200B शून्य-चौड़ाई वाला स्थान, U+200C शून्य-चौड़ाई वाला नॉन-जॉइनर, U+200D शून्य-चौड़ाई वाला जॉइनर और U+2060 वर्ड जॉइनर JavaScript व्हाइटस्पेस के बजाय प्रारूप वर्ण हैं। इसलिए साधारण `trim()` उन्हें नहीं हटाता। इन चिह्नों में से एक वाली पंक्ति केवल इसलिए रिक्त नहीं है क्योंकि स्क्रीन पर कोई स्याही नहीं दिखती है।

U+FEFF के दो संबंधित इतिहास हैं: एन्कोडेड डेटा की शुरुआत में यह बाइट ऑर्डर मार्क का संकेत दे सकता है, जबकि टेक्स्ट में यह शून्य-चौड़ाई वाले नो-ब्रेक स्पेस के रूप में कार्य करता है। ECMAScript में U+200B से U+200D के विपरीत, इसके ट्रिम व्हाइटस्पेस सेट में U+FEFF शामिल है। इसलिए पूरे शून्य-चौड़ाई वाले परिवार को एक प्रकार के रिक्त स्थान के रूप में मानना ​​वास्तविक JavaScript व्यवहार के विपरीत होगा।

उनका पता लगाना - चरित्र काउंटर का उपयोग करके उन संख्याओं का पता लगाना जो आपके द्वारा देखे गए से मेल नहीं खाते हैं, यह याद रखना कि कुछ जॉइनर्स पड़ोसी से जुड़ते हैं और छिपे रहते हैं

एक आश्चर्यजनक गणना आपको छिपी हुई सामग्री के प्रति सचेत कर सकती है, लेकिन यह हर मामले की पहचान नहीं कर सकती। ToolAcre उपलब्ध होने पर `Intl.Segmenter` के साथ ग्रेफेम समूहों की गणना करता है। एक जॉइनर जो इमोजी अनुक्रम में भाग लेता है, कई कोड बिंदुओं को एक ग्रेफेम बनाने में मदद कर सकता है, इसलिए इसे जोड़ने या हटाने से कोड-पॉइंट काउंटर द्वारा दिखाए जाने वाले सरल एक-वर्ण वृद्धि के बिना रेंडरिंग बदल सकती है।

एक साथ कई सुरागों का उपयोग करें: असफल सटीक मिलान, एक अप्रत्याशित "रिक्त स्थान के बिना" परिणाम, यूनिकोड-जागरूक एडिटर में निरीक्षण किए गए कॉपी किए गए पाठ, या विशिष्ट कोड बिंदुओं के लिए रेगेक्स खोज। सेगमेंटर अनुपलब्ध होने पर फ़ॉलबैक काउंटर कोड बिंदुओं का उपयोग करता है, इसलिए ब्राउज़र क्षमता के आधार पर परिणाम भी भिन्न हो सकते हैं। गिनने से जांच सीमित हो जाती है; यह कोई छिपा हुआ अक्षर स्कैनर या यूनिकोड नाम दर्शक नहीं है।

छिपे हुए पात्रों का पता लगाना: गिनती सुराग प्रदान करती है, पूरी सूची नहीं

एक पुष्टिकृत कॉपी-एंड-पेस्ट आर्टिफैक्ट के लिए, डुप्लिकेट पर काम करें और रेगेक्स मोड में ढूंढें और बदलें खोलें। `[​]` को खोजने और कुछ नहीं से बदलने पर शून्य-चौड़ाई वाले स्थान हट जाते हैं और पूरे पाठ में U+FEFF अक्षर एम्बेडेड हो जाते हैं। टूल JavaScript के वैश्विक ध्वज के साथ पैटर्न को संकलित करता है, प्रतिस्थापन गणना की रिपोर्ट करता है, और यदि पैटर्न अमान्य है तो पाठ को अपरिवर्तित छोड़ देता है।

उस पैटर्न को स्वचालित रूप से `[​-‍]` तक विस्तारित न करें। यह रेंज U+200C और U+200D को भी हटा देती है, जो स्क्रिप्ट के आकार को बदल सकती है और जुड़े हुए इमोजी को अलग-अलग प्रतीकों में विभाजित कर सकती है। उन कोड बिंदुओं को तभी जोड़ें जब निरीक्षण से साबित हो जाए कि वे अवांछित हैं। प्रतिस्थापन के बाद, डी-डुप्लीकेशन चलाएं और प्रकाशन से पहले आउटपुट की तुलना संरक्षित मूल से करें।

कार्यान्वित उदाहरण: डी-डुप्लिकेटिंग से पहले केवल पुष्टि किए गए अवांछित शून्य-चौड़ाई वाले वर्ण हटाएं

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

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

टेकअवे - अदृश्य का मतलब हानिरहित नहीं है; टेक्स्ट टूलकिट का काउंटर और रेगेक्स फाइंड-एंड-रिप्लेस आपके ब्राउज़र को छोड़े बिना उन्हें उजागर और हटा देता है

अदृश्य का मतलब खाली, विनिमेय या हानिकारक नहीं है। नॉन-ब्रेकिंग स्पेस लेआउट सिमेंटिक्स के साथ व्हाइटस्पेस हैं; शून्य-चौड़ाई वाले जॉइनर्स आकार देने वाले शब्दार्थ ले सकते हैं; U+FEFF JavaScript ट्रिमिंग के तहत फिर से अलग व्यवहार करता है। सटीक सफाई कोड बिंदु को नाम देने से शुरू होती है, यह समझना कि यह क्यों मौजूद हो सकता है और यह तय करना कि गंतव्य को अभी भी इसके कार्य की आवश्यकता है या नहीं।

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