हाल ही में, मुझे अपने फेडोरा लिनक्स इंस्टॉलेशन के साथ ओएस यूआई और ब्राउज़र में इमोजी प्रदर्शित करने में समस्या हुई है। इस मुद्दे ने मुझे फ़ॉन्ट कॉन्फ़िगरेशन प्रोजेक्ट के बारे में थोड़ी जांच करने के लिए प्रेरित किया, लेकिन मेरी कॉन्फ़िगरेशन और फ़ॉन्ट का परीक्षण करने के लिए, मुझे सभी यूनिकोड संस्करणों से इमोजी का उत्पादन करने की आवश्यकता थी, जिसने अंततः मुझे सभी इमोजी और कुछ को प्रिंट करने के लिए एक गोलांग "स्क्रिप्ट" लिखने के लिए प्रेरित किया। उनके आंतरिक के बारे में जानकारी.
इस पूरी यात्रा के दौरान, मैंने इमोजी के अंदरूनी हिस्सों, उनके बाइनरी प्रतिनिधित्व और इमोजी के संबंध में यूनिकोड मानक द्वारा किए गए कुछ अजीब/प्यारे निर्णयों के बारे में गहराई से जानकारी प्राप्त की।
लेकिन पहले, आइए एक कदम पीछे हटें और कुछ शब्दावली का सारांश प्रस्तुत करें।
हम एन्कोडिंग को किसी भाषा के एक अक्षर और इस अक्षर के द्विआधारी प्रतिनिधित्व के बीच "मैपिंग" या "अनुवाद" के रूप में वर्णित कर सकते हैं। उदाहरण के लिए, पारंपरिक ASCII एन्कोडिंग अक्षर a को 0x61 हेक्स (0b01100001 बाइनरी) पर मैप करता है। एन्कोडिंग के उदाहरण Microsoft (Windows 125x) या ISO (ISO/IEC 8859) 8-बिट कोड पेज हैं।
इन निश्चित 8-बिट कोड पृष्ठों में, उपयोग की गई जानकारी की न्यूनतम "राशि" 8-बिट (1 बाइट) है, जिसका अर्थ है कि उनमें 256 अलग-अलग अक्षर/अक्षर हो सकते हैं। कई भाषाओं का समर्थन करने के लिए 256 बाइनरी कोड का पुन: उपयोग करके विभिन्न कोड पेज बनाए गए। तो, इन 3 बाइट्स के साथ एक टेक्स्ट फ़ाइल होने पर [0xD0, 0xE5, 0xF2] ग्रीक आईएसओ 8859-7 का उपयोग करके "Πες" के रूप में पढ़ा जाता है, या पश्चिमी आईएसओ 8859-7 का उपयोग करके "Ðåò" (समान बाइट्स, अलग-अलग व्याख्या की जाती है) कोड पेज के आधार पर).
कुछ बिंदु पर, प्रौद्योगिकी की प्रगति के कारण कई अलग-अलग कोड पेजों का आकार अच्छा नहीं रहा। इसलिए, हमें कुछ ऐसी चीज़ की आवश्यकता थी जो सभी भाषाओं (और अधिक) में फिट हो सके और सभी प्रणालियों में एकीकृत हो।
[ बहुत सारे इतिहास और मानकों को छोड़कर वर्तमान तक तेजी से आगे बढ़ें ]
यूनिकोड मानक को दुनिया की उन सभी लेखन प्रणालियों का समर्थन करने के लिए डिज़ाइन किया गया था जिन्हें डिजिटलीकृत किया जा सकता है। तो, उपरोक्त उदाहरण का उपयोग करते हुए, यूनिकोड मानकों में, ग्रीक अक्षर "Π" का कोड 0x03A0 है जबकि लैटिन बड़े अक्षर eth "Ð" का कोड 0x00D0 है और अब यह टकराता नहीं है। यूनिकोड मानक के संस्करण हैं, और लेखन के समय, नवीनतम संस्करण 16.0 (विशेष) है।
लेकिन एक मिनट रुकें, यह "कोड बिंदु" क्या है?
यूनिकोड मानक में, प्रत्येक "अक्षर," नियंत्रण वर्ण, इमोजी और सामान्य रूप से प्रत्येक परिभाषित आइटम का एक अद्वितीय बाइनरी मान होता है जिसे "कोड बिंदु" कहा जाता है। मानक सभी कोड बिंदुओं को परिभाषित करता है, और प्रत्येक कोड बिंदु में शुद्ध कोड/बाइनरी जानकारी होती है। प्रत्येक कोड बिंदु के लिए हेक्साडेसिमल प्रारूप आमतौर पर यू उपसर्ग के साथ लिखा जाता है। उदाहरण के लिए, ग्रीक लघु अक्षर ओमेगा (ω) कोड बिंदु U 03C9 है।
तो हम वास्तव में उन कोड बिंदुओं को एन्कोड कौन करते हैं?
कोड बिंदुओं को बाइट्स में एन्कोड करने का पहला भाग एन्कोडिंग फ़ोमर्स है। मानक के अनुसार:
एन्कोडिंग फॉर्म निर्दिष्ट करते हैं कि यूनिकोड वर्ण के लिए प्रत्येक पूर्णांक (कोड बिंदु) को एक या अधिक कोड इकाइयों के अनुक्रम के रूप में कैसे व्यक्त किया जाना है।
एन्कोडिंग फॉर्म किसी विशेष एन्कोडिंग के भीतर यूनिकोड कोड बिंदु का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली डेटा की सबसे छोटी इकाई को संदर्भित करने के लिए "कोड यूनिट" शब्द का उपयोग करते हैं।
यूनिकोड मानक तीन अलग-अलग एन्कोडिंग फॉर्म को परिभाषित करता है:
इसका मतलब है कि एक एकल कोड बिंदु या कोड बिंदुओं के अनुक्रम को उपयोग किए गए एन्कोडिंग फॉर्म के आधार पर अलग-अलग तरीके से एन्कोड किया जा सकता है।
वह परत जो यूनिकोड में वास्तविक बाइनरी क्रमबद्धता का ख्याल रखती है, एन्कोडिंग स्कीम कहलाती है और सभी निम्न-स्तरीय विवरणों (जैसे एंडियननेस) का ख्याल रखती है। यूनिकोड विशिष्टता की तालिका 2-4:
|Encoding Scheme| Endian Order | BOM Allowed? | | ------------- | ----------------------------| ------------ | | UTF-8 | N/A | yes | | UTF-16 | Big-endian or little-endian | yes | | UTF-16BE | Big-endian | no | | UTF-16LE | Little-endian | no | | UTF-32 | Big-endian or little-endian | yes | | UTF-32BE | Big-endian | no | | UTF-32LE | Little-endian | no |
नोट: लगभग सभी आधुनिक प्रोग्रामिंग भाषाएं, ओएस और फ़ाइल सिस्टम यूनिकोड (इसकी एन्कोडिंग योजनाओं में से एक के साथ) को अपने मूल एन्कोडिंग के रूप में उपयोग करते हैं। जावा और .NET UTF-16 का उपयोग करते हैं, जबकि Golang आंतरिक स्ट्रिंग एन्कोडिंग के रूप में UTF-8 का उपयोग करता है (इसका मतलब है कि जब हम मेमोरी में कोई स्ट्रिंग बनाते हैं, तो इसे उल्लिखित एन्कोडिंग फॉर्म के साथ यूनिकोड में एन्कोड किया जाता है)
यूनिकोड मानक इमोजी (उनमें से बहुत सारे) के लिए कोड बिंदुओं को भी परिभाषित करता है, और (संस्करण संख्या के साथ कुछ मिश्रण के बाद), इमोजी "मानक" का संस्करण यूनिकोड मानक के समानांतर आगे बढ़ता है। लेखन के समय, हमारे पास इमोजी "16.0" और यूनिकोड मानक "16.0" हैं।
उदाहरण:
⛄ स्नोमैन विदाउट स्नो (यू 26सी4)
? मुस्कुराती आंखों और तीन दिलों वाला मुस्कुराता चेहरा (यू 1एफ970)
यूनिकोड उन संशोधकों को परिभाषित करता है जो इमोजी के आधार कोड बिंदु का पालन कर सकते हैं, जैसे विविधता और त्वचा टोन (हम विविधता भाग का पता नहीं लगाएंगे)।
हमारे पास छह त्वचा टोन संशोधक हैं (फिट्ज़पैट्रिक स्केल के बाद) जिन्हें इमोजी मॉडिफायर फिट्ज़पैट्रिक टाइप-एक्स (जहां एक्स 1 से 6 है) कहा जाता है, और वे सभी मानव इमोजी को प्रभावित करते हैं।
गोरी त्वचा (फिट्ज़पैट्रिक टाइप-1-2) (यू 1एफ3एफबी)
मध्यम-गोरी त्वचा (फिट्ज़पैट्रिक टाइप-3) (यू 1एफ3एफसी)
मध्यम त्वचा टोन (फिट्ज़पैट्रिक टाइप-4) (यू 1एफ3एफडी)
मध्यम-गहरी त्वचा (फिट्ज़पैट्रिक टाइप-5) (यू 1एफ3एफई)
गहरी त्वचा (फिट्ज़पैट्रिक टाइप-6) (यू 1एफ3एफएफ)
तो, उदाहरण के लिए, सभी मानव इमोजी की तरह, शिशु इमोजी? (यू 1एफ476), जब त्वचा संशोधक का पालन नहीं किया जाता है, तो तटस्थ पीले रंग में दिखाई देता है। इसके विपरीत, जब त्वचा का रंग संशोधक इसका अनुसरण करता है, तो यह तदनुसार बदल जाता है।
? यू 1एफ476
?? यू 1एफ476 यू 1एफ3एफएफ
?? यू 1एफ476 यू 1एफ3एफई
?? यू 1एफ476 यू 1एफ3एफडी
?? यू 1एफ476 यू 1एफ3एफसी
?? यू 1एफ476 यू 1एफ3एफबी
इमोजी/यूनिकोड मानक का सबसे अजीब लेकिन प्यारा निर्णय यह है कि कुछ इमोजी को बिना किसी स्टैंडअलोन कोड बिंदु के जीरो विड्थ जॉइनर का उपयोग करके दूसरों को एक साथ जोड़कर परिभाषित किया गया है।
इसलिए, उदाहरण के लिए, जब हम जोड़ते हैं:
सफ़ेद झंडा ?️ (U 1F3F3 U FE0F)
शून्य चौड़ाई योजक (यू 200डी)
इंद्रधनुष? (यू 1एफ308)
यह इंद्रधनुष ध्वज के रूप में दिखाई देता है ?️? (यू 1एफ3एफ3 यू एफई0एफ यू 200डी यू 1एफ308)
या, ?? ? => ???
या और भी, ?? ❤️ ? ?? => ??❤️???
यह इमोजी को एक साथ निचोड़ने जैसा है, और फिर, पूफ़?, एक नया इमोजी दिखाई देता है। वह कितना प्यारा है?
मैं सभी इमोजी के साथ एक मार्कडाउन टेबल बनाना चाहता था, और यूनिकोड इमोजी अनुक्रम टेबल इसके लिए सत्य का स्रोत हैं।
https://unicode.org/Public/emoji/16.0/emoji-sequences.txt
https://unicode.org/Public/emoji/16.0/emoji-zwj-sequences.txt
इसलिए मैंने एक गोलांग पार्सर बनाया (यहां) जो उन अनुक्रम फ़ाइलों को लाता है और पार्स करता है, जब अनुक्रम फ़ाइल में एक सीमा का वर्णन किया जाता है तो प्रत्येक इमोजी उत्पन्न करता है, और प्रत्येक के लिए कुछ आंतरिक जानकारी के साथ एक मार्कडाउन तालिका प्रिंट करता है (जैसे भाग यदि यह शामिल हो गया है, या आधार त्वचा का रंग, आदि)।
आप मार्कडाउन तालिका यहां पा सकते हैं।
इस तालिका का अंतिम कॉलम इस प्रारूप में है
str := "⌚" len([]rune(str)) // 1 len([]byte(str)) // 3
जैसा कि हमने चर्चा की, गोलांग आंतरिक स्ट्रिंग एन्कोडिंग यूटीएफ -8 है, जिसका अर्थ है कि, उदाहरण के लिए, घड़ी इमोजी के लिए ⌚ बाइट की लंबाई 3 है (क्योंकि यूटीएफ -8 इस कोड बिंदु को "लिखने" के लिए 3 बाइट्स उत्पन्न करता है), और कोड बिंदु की लंबाई 1 है।
गोलांग रूण == यूनिकोड कोड प्वाइंट
लेकिन जुड़े हुए इमोजी के मामले में - भले ही यह एक के रूप में "प्रकट" हो - हमारे पास कई कोड पॉइंट (रून्स) और यहां तक कि अधिक बाइट्स भी हैं।
str := "??❤️???" len([]rune(str)) // 10 len([]byte(str)) // 35
और इसका कारण यह है कि:
??❤️??? : ?? ZWJ ❤️ ZWJ ? ZWJ ?? ?? : 1F469 1F3FC // ? skin tone modifier [2 code points] ZWJ : 200D // [1 code points] * 3 ❤️ : 2764 FE0F // ❤ VS16 for emoji-style [2 code points] ? : 1F48B // [1 code point] ?? : 1F468 1F3FE // ? skin tone modifier [2 code points]
?
यह उल्लेखनीय है कि हम इमोजी को कैसे देखते हैं यह हमारे सिस्टम फ़ॉन्ट पर निर्भर करता है और यह फ़ॉन्ट इमोजी के किस संस्करण का समर्थन करता है।
मैं फ़ॉन्ट रेंडरिंग के सटीक आंतरिक विवरण नहीं जानता और यह कैसे जुड़े हुए फ़ॉन्ट को सही ढंग से प्रस्तुत कर सकता है। शायद यह भविष्य की पोस्ट होगी.
तब तक, जयकार?
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3