s utf 8 एन्कोडिंगमध्ये सर्व्हर-साइड प्रोग्रामिंग भाषा आणि डेटाबेस UTF-8 चे समर्थन करत नाहीत

चेरचर 30.03.2019
Android साठी

नमस्कार, KtoNaNovenkogo.ru ब्लॉगच्या प्रिय वाचकांनो. आज आम्ही तुमच्याशी साइटवर आणि प्रोग्राममधील क्रॅक कोठून येतात, कोणते मजकूर एन्कोडिंग अस्तित्वात आहेत आणि कोणते वापरावे याबद्दल बोलू. मूलभूत ASCII, तसेच त्याच्या विस्तारित आवृत्त्या CP866, KOI8-R, Windows 1251 पासून सुरू होणाऱ्या आणि युनिकोड कन्सोर्टियम UTF 16 आणि 8 च्या आधुनिक एन्कोडिंगसह समाप्त होणाऱ्या, त्यांच्या विकासाचा इतिहास जवळून पाहू. सामग्री सारणी:

  • Asuka च्या विस्तारित आवृत्त्या - CP866 आणि KOI8-R एन्कोडिंग
  • Windows 1251 - ASCII भिन्नता आणि का krakozyabry बाहेर येतात
काहींना, ही माहिती अनावश्यक वाटू शकते, परंतु क्रॉलिंग क्रॅकोझ्याब्र्स (अवाचनीय वर्णांचा संच) संदर्भात मला किती प्रश्न प्राप्त झाले हे तुम्हाला माहीत आहे का? आता मला प्रत्येकाला या लेखाच्या मजकुराचा संदर्भ घेण्याची आणि माझ्या स्वतःच्या चुका शोधण्याची संधी मिळेल. बरं, माहिती आत्मसात करण्यासाठी सज्ज व्हा आणि कथेच्या प्रवाहाचे अनुसरण करण्याचा प्रयत्न करा.

ASCII - लॅटिन वर्णमाला साठी मूलभूत मजकूर एन्कोडिंग

आयटी उद्योगाच्या निर्मितीसह मजकूर एन्कोडिंगचा विकास एकाच वेळी झाला आणि या काळात त्यांनी बरेच बदल केले. ऐतिहासिकदृष्ट्या, हे सर्व EBCDIC सह सुरू झाले, जे रशियन उच्चारांमध्ये ऐवजी असंगत होते, ज्यामुळे अक्षरे एन्कोड करणे शक्य झाले. लॅटिन वर्णमाला, नियंत्रण वर्णांसह अरबी अंक आणि विरामचिन्हे. परंतु तरीही, आधुनिक मजकूर एन्कोडिंगच्या विकासाचा प्रारंभिक बिंदू प्रसिद्ध मानला पाहिजे ASCII(अमेरिकन मानक साठी कोड माहिती अदलाबदल, जे रशियन भाषेत सहसा "आस्की" म्हणून उच्चारले जाते). हे इंग्रजी भाषिक वापरकर्त्यांद्वारे सामान्यतः वापरल्या जाणाऱ्या पहिल्या 128 वर्णांचे वर्णन करते - लॅटिन अक्षरे, अरबी अंक आणि विरामचिन्हे. ASCII मध्ये वर्णन केलेल्या या 128 वर्णांमध्ये काही समाविष्ट आहेत सेवा वर्णजसे ब्रॅकेट, हॅश मार्क्स, तारका इ. खरं तर, आपण त्यांना स्वतः पाहू शकता:
ASCII च्या मूळ आवृत्तीतील हे 128 वर्ण मानक बनले आहेत आणि इतर कोणत्याही एन्कोडिंगमध्ये तुम्हाला ते नक्कीच सापडतील आणि ते या क्रमाने दिसतील. परंतु वस्तुस्थिती अशी आहे की माहितीच्या एका बाइटसह तुम्ही १२८ नव्हे तर २५६ भिन्न मूल्ये एन्कोड करू शकता (दोन ते आठची शक्ती २५६ इतकी आहे), त्यामुळे खालील मूलभूत आवृत्तीअसुकांची संपूर्ण मालिका दिसू लागली विस्तारित ASCII एन्कोडिंग, ज्यामध्ये, 128 मूलभूत वर्णांव्यतिरिक्त, राष्ट्रीय एन्कोडिंगची चिन्हे एन्कोड करणे देखील शक्य होते (उदाहरणार्थ, रशियन). येथे, वर्णनात वापरल्या जाणाऱ्या संख्या प्रणालींबद्दल थोडे अधिक सांगणे योग्य आहे. सर्वप्रथम, जसे की आपणा सर्वांना माहिती आहे की, संगणक केवळ बायनरी प्रणालीमधील संख्यांसह कार्य करतो, म्हणजे शून्य आणि एक (“ बुलियन बीजगणित"जर कोणी कॉलेज किंवा शाळेत गेले असेल तर). एका बाइटमध्ये आठ बिट्स असतात, त्यातील प्रत्येक पॉवर दोनची असते, शून्यापासून सुरू होते आणि दोन ते सातव्या पॉवरने समाप्त होते:
प्रत्येकाला हे समजणे अवघड नाही संभाव्य संयोजनअशा बांधकामात फक्त 256 शून्य आणि एक असू शकतात बायनरी प्रणालीदशांश ते अगदी सोपे आहे. तुम्हाला फक्त दोनच्या सर्व शक्ती त्यांच्या वरील बरोबर जोडणे आवश्यक आहे. आमच्या उदाहरणात, हे 1 (शून्य ची 2 ची घात) अधिक 8 (दोन ची 3 ची घात), अधिक 32 (दोन ची पाचवी घात), अधिक 64 (सहाव्या घाताची), अधिक 128 असे निघते. (सातव्या शक्तीकडे). एकूण 233 इंच दशांश प्रणालीहिशेब जसे आपण पाहू शकता, सर्वकाही अगदी सोपे आहे. परंतु जर तुम्ही ASCII अक्षरांसह सारणीकडे बारकाईने पाहिले तर तुम्हाला ते हेक्साडेसिमल एन्कोडिंगमध्ये दर्शविले गेले असल्याचे दिसेल. उदाहरणार्थ, आस्कीमध्ये "तारांकित" जुळते हेक्साडेसिमल संख्या 2A. तुम्हाला कदाचित हे माहित असेल की हेक्साडेसिमल प्रणाली A (म्हणजे दहा) ते F (म्हणजे पंधरा) अरबी अंक आणि लॅटिन अक्षरांव्यतिरिक्त संख्या वापरली जातात. बरं मग, साठी भाषांतर बायनरी संख्याहेक्साडेसिमल पर्यंतखालील सोप्या आणि स्पष्ट पद्धतीचा अवलंब करा. वरील स्क्रीनशॉटमध्ये दाखवल्याप्रमाणे माहितीचा प्रत्येक बाइट चार बिट्सच्या दोन भागात विभागलेला आहे. ते. प्रत्येक अर्ध्या बाइटमध्ये बायनरी कोडफक्त सोळा मूल्ये एन्कोड केली जाऊ शकतात (दोन ते चौथ्या पॉवर), जी सहजपणे हेक्साडेसिमल संख्या म्हणून दर्शविली जाऊ शकतात. शिवाय, बाइटच्या डाव्या अर्ध्या भागात, स्क्रीनशॉटमध्ये दर्शविल्याप्रमाणे नाही, शून्यापासून प्रारंभ करून अंश पुन्हा मोजणे आवश्यक आहे. परिणामी, साध्या गणनेद्वारे, आम्हाला मिळते की स्क्रीनशॉटमध्ये E9 क्रमांक एन्कोड केलेला आहे. मला आशा आहे की माझ्या युक्तिवादाचा मार्ग आणि या कोडेचे निराकरण तुम्हाला स्पष्ट झाले असेल. बरं, आता मजकूर एन्कोडिंगबद्दल बोलूया.

Asuka च्या विस्तारित आवृत्त्या - CP866 आणि KOI8-R स्यूडोग्राफिक्ससह एन्कोडिंग

म्हणून, आम्ही ASCII बद्दल बोलू लागलो, जो होता, सर्व आधुनिक एन्कोडिंगच्या विकासाचा प्रारंभिक बिंदू (Windows 1251, Unicode, UTF 8). सुरुवातीला, त्यात लॅटिन वर्णमाला, अरबी अंक आणि इतर काही केवळ 128 वर्ण होते, परंतु विस्तारित आवृत्तीमध्ये माहितीच्या एका बाइटमध्ये एन्कोड केलेली सर्व 256 मूल्ये वापरणे शक्य झाले. त्या. आस्कीमध्ये तुमच्या भाषेतील अक्षरांची चिन्हे जोडणे शक्य झाले. येथे स्पष्ट करण्यासाठी आपल्याला पुन्हा विषयांतर करावे लागेल - आम्हाला मजकूर एन्कोडिंगची अजिबात गरज का आहे?आणि ते इतके महत्वाचे का आहे. तुमच्या संगणकाच्या स्क्रीनवरील वर्ण दोन गोष्टींच्या आधारे तयार होतात - सर्व प्रकारच्या वर्णांचे व्हेक्टर आकार (प्रतिनिधित्व) संच (ते तुमच्या संगणकावर स्थापित केलेल्या फॉन्टसह फाइल्समध्ये असतात) आणि कोड जो तुम्हाला अचूकपणे बाहेर काढू देतो. व्हेक्टर आकार (फॉन्ट फाईल) च्या या संचातून योग्य ठिकाणी घालणे आवश्यक आहे. हे स्पष्ट आहे की व्हेक्टर आकारांसाठी फॉन्ट स्वतः जबाबदार आहेत, परंतु ऑपरेटिंग सिस्टम आणि त्यात वापरलेले प्रोग्राम एन्कोडिंगसाठी जबाबदार आहेत. त्या. तुमच्या संगणकावरील कोणताही मजकूर हा बाइट्सचा संच असेल, ज्यापैकी प्रत्येक या मजकुराचा एक एकल वर्ण एन्कोड करतो. हा मजकूर स्क्रीनवर प्रदर्शित करणारा प्रोग्राम (टेक्स्ट एडिटर, ब्राउझर इ.), कोड पार्स करताना, पुढील वर्णाचे एन्कोडिंग वाचतो आणि संबंधित वेक्टर फॉर्म शोधतो. आवश्यक फाइलहा मजकूर दस्तऐवज प्रदर्शित करण्यासाठी जोडलेला फॉन्ट. सर्व काही साधे आणि सामान्य आहे. याचा अर्थ असा की आम्हाला आवश्यक असलेले कोणतेही वर्ण एन्कोड करण्यासाठी (उदाहरणार्थ, राष्ट्रीय वर्णमालावरून), दोन अटी पूर्ण केल्या पाहिजेत - या वर्णाचा वेक्टर फॉर्म वापरलेल्या फॉन्टमध्ये असणे आवश्यक आहे आणि हे वर्ण विस्तारित ASCII एन्कोडिंगमध्ये एन्कोड केले जाऊ शकते. एक बाइट. म्हणून, असे पर्याय अस्तित्वात आहेत संपूर्ण घड. फक्त रशियन भाषेतील वर्ण एन्कोड करण्यासाठी, विस्तारित आस्काचे अनेक प्रकार आहेत. उदाहरणार्थ, मूळतः दिसू लागले CP866, ज्यामध्ये रशियन वर्णमालेतील वर्ण वापरण्याची क्षमता होती आणि ती ASCII ची विस्तारित आवृत्ती होती. त्या. तिला वरचा भागअसुका (128 लॅटिन वर्ण, संख्या आणि इतर बकवास) च्या मूळ आवृत्तीशी पूर्णपणे जुळते, जे अगदी वरच्या स्क्रीनशॉटमध्ये सादर केले आहे, परंतु आता तळाचा भाग CP866 एन्कोडिंगसह टेबल्समध्ये फक्त खाली स्क्रीनशॉटमध्ये दर्शविलेले फॉर्म होते आणि तुम्हाला आणखी 128 वर्ण (रशियन अक्षरे आणि सर्व प्रकारचे स्यूडो-ग्राफिक्स) एन्कोड करण्याची परवानगी दिली:
तुम्ही पहा, उजव्या स्तंभात संख्या 8 ने सुरू होते, कारण... 0 ते 7 पर्यंतची संख्या ASCII च्या मूलभूत भागाचा संदर्भ देते (पहिला स्क्रीनशॉट पहा). ते. CP866 मधील रशियन अक्षर “M” मध्ये कोड 9C असेल (हे 9 सह संबंधित ओळीच्या छेदनबिंदूवर स्थित आहे आणि हेक्साडेसिमल क्रमांक प्रणालीमधील क्रमांक C सह स्तंभ), जे माहितीच्या एका बाइटमध्ये लिहिले जाऊ शकते, आणि जर उपलब्ध योग्य फॉन्टरशियन वर्णांसह, हे पत्र कोणत्याही समस्येशिवाय मजकूरात दिसेल. ही रक्कम कुठून आली? CP866 मध्ये स्यूडोग्राफिक्स? संपूर्ण मुद्दा असा आहे की रशियन मजकूरासाठी हे एन्कोडिंग त्या खडबडीत वर्षांमध्ये विकसित केले गेले होते जेव्हा ग्राफिकल ऑपरेटिंग सिस्टम आता आहेत तितक्या व्यापक नव्हत्या. आणि डोसा आणि तत्सम मजकूर ऑपरेटिंग सिस्टीममध्ये, स्यूडोग्राफिक्सने किमान कोणत्याही प्रकारे मजकूरांच्या डिझाइनमध्ये विविधता आणणे शक्य केले आणि म्हणून CP866 आणि असुकाच्या विस्तारित आवृत्त्यांच्या श्रेणीतील इतर सर्व समवयस्क त्यात विपुल आहेत. CP866 IBM द्वारे वितरीत केले गेले, परंतु या व्यतिरिक्त, रशियन भाषेतील वर्णांसाठी अनेक एन्कोडिंग विकसित केले गेले, उदाहरणार्थ, समान प्रकार (विस्तारित ASCII) श्रेय दिले जाऊ शकतात. KOI8-R:
त्याच्या ऑपरेशनचे सिद्धांत थोडे पूर्वी वर्णन केलेल्या CP866 प्रमाणेच राहते - मजकूराचे प्रत्येक वर्ण एका सिंगल बाइटद्वारे एन्कोड केलेले आहे. स्क्रीनशॉट KOI8-R सारणीचा दुसरा भाग दर्शवितो, कारण पूर्वार्ध मूलभूत असुकाशी पूर्णपणे सुसंगत आहे, जो या लेखातील पहिल्या स्क्रीनशॉटमध्ये दर्शविला आहे. KOI8-R एन्कोडिंगच्या वैशिष्ट्यांपैकी, हे लक्षात घेतले जाऊ शकते की त्याच्या टेबलमधील रशियन अक्षरे आत जात नाहीत. वर्णक्रमानुसार, उदाहरणार्थ, त्यांनी CP866 मध्ये केले. जर तुम्ही पहिला स्क्रीनशॉट पाहिला (मूलभूत भागाचा, जो सर्व विस्तारित एन्कोडिंगमध्ये समाविष्ट आहे), तुमच्या लक्षात येईल की KOI8-R मध्ये रशियन अक्षरे टेबलच्या समान सेलमध्ये लॅटिन वर्णमालाच्या संबंधित अक्षरे आहेत. टेबलच्या पहिल्या भागापासून. हे फक्त एक बिट (दोन ते सातव्या पॉवर किंवा 128) टाकून रशियनमधून लॅटिन वर्णांवर स्विच करण्याच्या सोयीसाठी केले गेले.

Windows 1251 - ASCII ची आधुनिक आवृत्ती आणि क्रॅक का बाहेर येतात

मजकूर एन्कोडिंगचा पुढील विकास या वस्तुस्थितीमुळे झाला की ग्राफिकल ऑपरेटिंग सिस्टम लोकप्रिय होत आहेत आणि त्यामध्ये स्यूडोग्राफिक्स वापरण्याची आवश्यकता कालांतराने नाहीशी झाली. परिणामी, एक संपूर्ण गट असा निर्माण झाला की, मूलत: अजूनही असुकाच्या विस्तारित आवृत्त्या होत्या (मजकूराचा एक वर्ण माहितीच्या एका बाइटसह एन्कोड केलेला आहे), परंतु स्यूडोग्राफिक चिन्हे वापरल्याशिवाय. ते तथाकथित लोकांचे होते ANSI एन्कोडिंग, जे अमेरिकन स्टँडर्ड्स इन्स्टिट्यूटने विकसित केले होते. सामान्य भाषेत, रशियन भाषेच्या समर्थनासह आवृत्तीसाठी सिरिलिक नाव देखील वापरले गेले. याचे उदाहरण देता येईल विंडोज 1251. हे पूर्वी वापरलेल्या CP866 आणि KOI8-R पेक्षा अनुकूलपणे भिन्न आहे कारण त्यात स्यूडोग्राफिक चिन्हांची जागा रशियन टायपोग्राफीच्या गहाळ चिन्हे (उच्चार चिन्ह वगळता) तसेच जवळच्या स्लाव्हिक भाषांमध्ये वापरल्या जाणाऱ्या चिन्हांनी घेतली होती. रशियन (युक्रेनियन, बेलारूसी इ.):
रशियन भाषेच्या एन्कोडिंगच्या अशा विपुलतेमुळे, फॉन्ट उत्पादक आणि उत्पादक सॉफ्टवेअरडोकेदुखी सतत उद्भवली, आणि तुम्ही आणि मी, प्रिय वाचक, अनेकदा तेच कुप्रसिद्ध झाले krakozyabryजेव्हा मजकूरात वापरलेल्या आवृत्तीमध्ये गोंधळ होता. द्वारे संदेश पाठवताना आणि प्राप्त करताना ते बरेचदा दिसू लागले ईमेल, ज्याने अतिशय जटिल रूपांतरण तक्त्या तयार केल्या आहेत, जे खरं तर, या समस्येचे निराकरण करण्यात मूलभूतपणे अक्षम होते आणि बहुतेकदा वापरकर्ते पत्रव्यवहारासाठी लॅटिन अक्षरांचे लिप्यंतरण वापरतात जेणेकरुन रशियन एन्कोडिंग जसे की CP866, KOI8- वापरताना कुख्यात नौटंकी टाळण्यासाठी. R किंवा Windows 1251 खरेतर, रशियन मजकुराऐवजी दिसणारे krakozyabrs हे एन्कोडिंगच्या चुकीच्या वापराचे परिणाम होते. या भाषेचा, जे एन्कोड केलेले एकाशी जुळत नाही मजकूर संदेशसुरुवातीला उदाहरणार्थ, जर तुम्ही कोड वापरून CP866 वापरून एन्कोड केलेले वर्ण प्रदर्शित करण्याचा प्रयत्न केला विंडोज टेबल 1251, नंतर संदेशाचा मजकूर पूर्णपणे पुनर्स्थित करून, तेच गब्बरिश (अर्थहीन वर्णांचा संच) बाहेर येतील. वेबसाइट, फोरम किंवा ब्लॉग तयार करताना आणि सेट करताना अशीच परिस्थिती उद्भवते, जेव्हा रशियन अक्षरांसह मजकूर चुकीने साइटवर डीफॉल्टनुसार वापरल्या जाणाऱ्या चुकीच्या एन्कोडिंगमध्ये किंवा चुकीच्या एन्कोडिंगमध्ये जतन केला जातो. मजकूर संपादक, जे उघड्या डोळ्यांना न दिसणाऱ्या कोडमध्ये गॅग जोडते. सरतेशेवटी, पुष्कळ लोक या परिस्थितीला पुष्कळ एन्कोडिंगसह कंटाळले आणि सतत बकवास बाहेर काढले, आणि एक नवीन सार्वभौमिक भिन्नता तयार करण्यासाठी पूर्व-आवश्यकता दिसू लागली जी सर्व विद्यमान बदलांना पुनर्स्थित करेल आणि शेवटी देखाव्यासह समस्या सोडवेल. न वाचता येणारे मजकूर. याव्यतिरिक्त, चीनी सारख्या भाषांची समस्या होती, जिथे 256 पेक्षा जास्त भाषा वर्ण होते.

युनिकोड - युनिव्हर्सल एन्कोडिंग्स UTF 8, 16 आणि 32

आग्नेय आशियाई भाषा गटातील या हजारो वर्णांचे वर्णन ASCII च्या विस्तारित आवृत्त्यांमध्ये वर्ण एन्कोडिंगसाठी वाटप केलेल्या माहितीच्या एका बाइटमध्ये केले जाऊ शकत नाही. परिणामी, एक कन्सोर्टियम तयार केले गेले युनिकोड(युनिकोड - युनिकोड कन्सोर्टियम) अनेक आयटी उद्योगातील नेत्यांच्या सहकार्याने (जे सॉफ्टवेअर तयार करतात, हार्डवेअर एन्कोड करतात, जे फॉन्ट तयार करतात), ज्यांना सार्वत्रिक मजकूर एन्कोडिंगच्या उदयामध्ये रस होता. युनिकोड कन्सोर्टियमच्या आश्रयाने प्रसिद्ध झालेला पहिला प्रकार होता UTF 32. एन्कोडिंग नावातील संख्या म्हणजे एक वर्ण एन्कोड करण्यासाठी वापरल्या जाणाऱ्या बिट्सची संख्या. नवीन युनिव्हर्सल UTF एन्कोडिंगमध्ये एक एकल वर्ण एन्कोड करण्यासाठी आवश्यक असणाऱ्या माहितीच्या 4 बाइट्सच्या बरोबरीचे 32 बिट. परिणामी, ASCII च्या विस्तारित आवृत्तीमध्ये आणि UTF-32 मध्ये एन्कोड केलेली मजकूर असलेली समान फाइल, नंतरच्या बाबतीत, आकार (वजन) चारपट मोठा असेल. हे वाईट आहे, परंतु आता आमच्याकडे YTF वापरून दोन ते बत्तीस-सेकंद पॉवरच्या बरोबरीच्या अक्षरांची संख्या एन्कोड करण्याची संधी आहे ( अब्जावधी वर्ण, जे कोणत्याही वास्तविक कव्हर करेल आवश्यक मूल्यएक प्रचंड राखीव सह). परंतु युरोपियन गटाच्या भाषा असलेल्या अनेक देशांसाठी हे आहे प्रचंड रक्कमएन्कोडिंगमध्ये अक्षरे वापरण्याची अजिबात गरज नव्हती, परंतु जेव्हा UTF-32 वापरला गेला तेव्हा त्यांच्या वजनात चौपट वाढ झाली नसती. मजकूर दस्तऐवज, आणि परिणामी, इंटरनेट ट्रॅफिकचे प्रमाण आणि संग्रहित डेटाचे प्रमाण वाढले आहे. हे खूप आहे आणि कोणीही असा कचरा घेऊ शकत नाही. युनिकोडच्या विकासाचा परिणाम म्हणून, UTF-16, जे इतके यशस्वी ठरले की ते आम्ही वापरत असलेल्या सर्व वर्णांसाठी मूलभूत जागा म्हणून डीफॉल्टनुसार स्वीकारले गेले. एक वर्ण एन्कोड करण्यासाठी ते दोन बाइट्स वापरते. ही गोष्ट कशी दिसते ते पाहूया. विंडोज ऑपरेटिंग सिस्टममध्ये, तुम्ही “प्रारंभ” - “प्रोग्राम” - “ॲक्सेसरीज” - “सिस्टम टूल्स” - “कॅरेक्टर टेबल” या मार्गाचे अनुसरण करू शकता. परिणामी, तुमच्या सिस्टमवर स्थापित केलेल्या सर्व फॉन्टच्या वेक्टर आकारांसह एक टेबल उघडेल. आपण "मध्ये निवडल्यास अतिरिक्त पर्याय» युनिकोड वर्णांचा संच, आपण प्रत्येक फॉन्टसाठी त्यात समाविष्ट केलेली वर्णांची संपूर्ण श्रेणी स्वतंत्रपणे पाहू शकता. तसे, त्यापैकी कोणत्याही वर क्लिक करून, आपण त्याचे दोन-बाइट पाहू शकता UTF-16 फॉरमॅटमध्ये कोड, चार हेक्साडेसिमल अंकांचा समावेश आहे: UTF-16 मध्ये 16 बिट्स वापरून किती वर्ण एन्कोड केले जाऊ शकतात? 65,536 (दोन ते सोळा च्या पॉवर), आणि ही संख्या आहे जी युनिकोडमध्ये बेस स्पेस म्हणून स्वीकारली गेली. याव्यतिरिक्त, ते वापरून सुमारे दोन दशलक्ष वर्ण एन्कोड करण्याचे मार्ग आहेत, परंतु ते मजकूराच्या दशलक्ष वर्णांच्या विस्तारित जागेपर्यंत मर्यादित होते. परंतु युनिकोड एन्कोडिंगच्या या यशस्वी आवृत्तीने देखील ज्यांनी लिहिले त्यांना फारसे समाधान मिळाले नाही, उदाहरणार्थ, फक्त प्रोग्राम्स इंग्रजी, कारण ASCII च्या विस्तारित आवृत्तीपासून UTF-16 मध्ये संक्रमण झाल्यानंतर, दस्तऐवजांचे वजन दुप्पट झाले (Aski मध्ये प्रति वर्ण एक बाइट आणि UTF-16 मध्ये समान वर्णासाठी दोन बाइट). युनिकोड कन्सोर्टियममधील सर्वांच्या आणि सर्वांच्या समाधानासाठी हे निश्चितपणे ठरवले गेले. एन्कोडिंगसह यापरिवर्तनीय लांबी. त्याला UTF-8 असे म्हणतात. शीर्षकात आठ असूनही ते खरोखरच आहे परिवर्तनीय लांबी, म्हणजे मजकूराचा प्रत्येक वर्ण एक ते सहा बाइट लांबीच्या अनुक्रमात एन्कोड केला जाऊ शकतो. व्यवहारात, UTF-8 फक्त एक ते चार बाइट्सची श्रेणी वापरते, कारण कोडच्या चार बाइट्सच्या पलीकडे कोणत्याही गोष्टीची कल्पना करणे देखील सैद्धांतिकदृष्ट्या शक्य नाही. त्यातील सर्व लॅटिन अक्षरे एका बाइटमध्ये एन्कोड केलेली आहेत, अगदी जुन्या ASCII प्रमाणे. लक्षात घेण्यासारखे आहे की केवळ लॅटिन वर्णमाला एन्कोड करण्याच्या बाबतीत, युनिकोड न समजणारे प्रोग्राम देखील YTF-8 मध्ये एन्कोड केलेले काय वाचतील. त्या. असुकाचा मुख्य भाग युनिकोड कन्सोर्टियमच्या या निर्मितीमध्ये हस्तांतरित करण्यात आला. UTF-8 मधील सिरिलिक वर्ण दोन बाइट्समध्ये एन्कोड केलेले आहेत आणि उदाहरणार्थ, जॉर्जियन वर्ण - तीन बाइट्समध्ये. युनिकोड कन्सोर्टियमने, UTF 16 आणि 8 तयार केल्यानंतर, मुख्य समस्या सोडवली - आता आमच्याकडे आहे फॉन्टमध्ये एकच कोड स्पेस आहे. आणि आता त्यांचे उत्पादक त्यांच्या सामर्थ्य आणि क्षमतांवर आधारित मजकूर वर्णांच्या वेक्टर फॉर्मसह ते भरू शकतात. अगदी वर दिलेल्या "प्रतीक तक्त्या" मध्ये, ते पाहिले जाऊ शकते भिन्न फॉन्टसमर्थन विविध प्रमाणातचिन्हे काही युनिकोड-समृद्ध फॉन्ट खूप भारी असू शकतात. परंतु आता ते भिन्न एन्कोडिंगसाठी तयार केले गेले आहेत या वस्तुस्थितीत भिन्न नाहीत, परंतु फॉन्ट निर्मात्याने विशिष्ट वेक्टर फॉर्मसह एकल कोड जागा भरली आहे किंवा पूर्णपणे भरली नाही.

रशियन अक्षरांऐवजी वेडे शब्द - ते कसे सोडवायचे

आता मजकुराऐवजी krakozyabrs कसे दिसतात किंवा दुसऱ्या शब्दांत, रशियन मजकूरासाठी योग्य एन्कोडिंग कसे निवडले जाते ते पाहू या. वास्तविक, तो ज्या प्रोग्राममध्ये तुम्ही हा मजकूर तयार किंवा संपादित करता, किंवा मजकूराच्या तुकड्यांचा वापर करून कोड सेट केला आहे. संपादन आणि तयार करण्यासाठी मजकूर फाइल्सवैयक्तिकरित्या, मी माझ्या मते, Html आणि PHP संपादक Notepad++ वापरतो. तथापि, ते इतर शेकडो प्रोग्रामिंग आणि मार्कअप भाषांचे वाक्यरचना हायलाइट करू शकते आणि प्लगइन वापरून विस्तारित करण्याची क्षमता देखील आहे. वाचा तपशीलवार पुनरावलोकनहे अप्रतिम कार्यक्रमदिलेल्या लिंकद्वारे. IN शीर्ष मेनू Notepad++ मध्ये एक "एनकोडिंग" आयटम आहे, जिथे तुम्हाला तुमच्या साइटवर डीफॉल्टनुसार वापरल्या जाणाऱ्या विद्यमान पर्यायामध्ये रूपांतरित करण्याची संधी असेल:
जूमला 1.5 आणि त्यावरील साइटच्या बाबतीत, तसेच वर्डप्रेसवरील ब्लॉगच्या बाबतीत, तुम्ही क्रॅक दिसणे टाळण्यासाठी पर्याय निवडावा. UTF 8 BOM शिवाय. BOM उपसर्ग काय आहे? वस्तुस्थिती अशी आहे की जेव्हा ते YUTF-16 एन्कोडिंग विकसित करत होते, तेव्हा काही कारणास्तव त्यांनी थेट अनुक्रमात (उदाहरणार्थ, 0A15) आणि उलट (150A) दोन्ही वर्ण कोड लिहिण्याची क्षमता यासारखी गोष्ट जोडण्याचा निर्णय घेतला. . आणि कोड्स कोणत्या क्रमाने वाचायचे हे प्रोग्राम्सला समजण्यासाठी, त्याचा शोध लावला गेला BOM(बाइट ऑर्डर मार्क किंवा, दुसऱ्या शब्दांत, स्वाक्षरी), जे कागदपत्रांच्या अगदी सुरुवातीस तीन अतिरिक्त बाइट जोडून व्यक्त केले गेले. UTF-8 एन्कोडिंगमध्ये, युनिकोड कन्सोर्टियममध्ये कोणतेही BOM प्रदान केले गेले नाहीत आणि म्हणून स्वाक्षरी जोडणे (दस्तऐवजाच्या सुरूवातीस ते कुख्यात अतिरिक्त तीन बाइट्स) काही प्रोग्राम्सना कोड वाचण्यापासून प्रतिबंधित करते. म्हणून, UTF मध्ये फाइल्स सेव्ह करताना, आम्ही नेहमी BOM शिवाय (स्वाक्षरीशिवाय) पर्याय निवडला पाहिजे. त्यामुळे तुम्ही आगाऊ आहात क्रॉलिंग क्रॅकोझ्याबर्सपासून स्वतःचे संरक्षण करा. लक्षात घेण्यासारखे आहे की विंडोजमधील काही प्रोग्राम्स हे करू शकत नाहीत (ते बीओएमशिवाय यूटीएफ -8 मध्ये मजकूर जतन करू शकत नाहीत), उदाहरणार्थ, समान कुख्यात विंडोज नोटपॅड. हे दस्तऐवज UTF-8 मध्ये सेव्ह करते, परंतु तरीही त्याच्या सुरुवातीला स्वाक्षरी (तीन अतिरिक्त बाइट) जोडते. शिवाय, हे बाइट्स नेहमी सारखेच असतील - कोड थेट क्रमाने वाचा. परंतु सर्व्हरवर, या छोट्या गोष्टीमुळे, एक समस्या उद्भवू शकते - बदमाश बाहेर येतील. म्हणून, कोणत्याही परिस्थितीत नियमित वापरू नका विंडोज नोटपॅड तुमच्या साइटवरील दस्तऐवज संपादित करण्यासाठी तुम्हाला कोणतीही क्रॅक दिसण्याची इच्छा नसल्यास. सर्वोत्तम आणि सर्वात साधा पर्यायमला वाटते आधीच उल्लेख केला आहे नोटपॅड संपादक++, ज्याचे व्यावहारिकदृष्ट्या कोणतेही तोटे नाहीत आणि केवळ फायदे आहेत. Notepad++ मध्ये, जेव्हा तुम्ही एन्कोडिंग निवडता, तेव्हा तुमच्याकडे मजकूर UCS-2 एन्कोडिंगमध्ये रूपांतरित करण्याचा पर्याय असेल, जो युनिकोड मानकाच्या अगदी जवळ आहे. तसेच नोटपॅडमध्ये एएनएसआयमधील मजकूर एन्कोड करणे शक्य होईल, म्हणजे. रशियन भाषेच्या संदर्भात, हे Windows 1251 असेल, ज्याचे आम्ही आधीच वर्णन केले आहे की ही माहिती कोठून येते? हे तुमच्या ऑपरेटिंग रूमच्या नोंदणीमध्ये नोंदणीकृत आहे विंडोज सिस्टम्स- ANSI च्या बाबतीत कोणते एन्कोडिंग निवडायचे, OEM च्या बाबतीत कोणते निवडायचे (रशियन भाषेसाठी ते CP866 असेल). तुम्ही तुमच्या संगणकावर दुसरी डीफॉल्ट भाषा सेट केल्यास, ही एन्कोडिंग्स त्याच भाषेसाठी ANSI किंवा OEM श्रेणीतील तत्सम भाषांसह बदलली जातील. तुम्ही दस्तऐवज Notepad++ मध्ये तुम्हाला आवश्यक असलेल्या एन्कोडिंगमध्ये सेव्ह केल्यानंतर किंवा संपादनासाठी साइटवरून दस्तऐवज उघडल्यानंतर, तुम्ही त्याचे नाव संपादकाच्या खालच्या उजव्या कोपर्यात पाहू शकता: rednecks टाळण्यासाठी, वर वर्णन केलेल्या क्रियांव्यतिरिक्त, हेडरमध्ये लिहिणे उपयुक्त ठरेल स्रोत कोडया एन्कोडिंगबद्दल साइटची सर्व पृष्ठे माहिती, जेणेकरून सर्व्हर किंवा स्थानिक होस्टवर कोणताही गोंधळ होणार नाही. सर्वसाधारणपणे, सर्व भाषांमध्ये हायपरटेक्स्ट मार्कअप Html व्यतिरिक्त, एक विशेष xml घोषणा वापरली जाते, जी मजकूर एन्कोडिंग दर्शवते.< ? xml version= "1.0" encoding= "windows-1251" ? >कोड पार्स करण्यापूर्वी, ब्राउझरला माहित असते की कोणती आवृत्ती वापरली जात आहे आणि त्या भाषेच्या अक्षर कोडचा नेमका अर्थ कसा लावायचा आहे. परंतु लक्षात घेण्याजोगा गोष्ट म्हणजे जर तुम्ही दस्तऐवज डीफॉल्ट युनिकोडमध्ये सेव्ह केला तर ही xml घोषणा वगळली जाऊ शकते (बीओएम नसल्यास UTF-8 किंवा बीओएम असल्यास UTF-16 एन्कोडिंग मानले जाईल). दस्तऐवजाच्या बाबतीत HTML भाषाएन्कोडिंग दर्शविण्यासाठी वापरले जाते मेटा घटक, जे ओपनिंग आणि क्लोजिंग हेड टॅग दरम्यान लिहिलेले आहे: < head> . . . < meta charset= "utf-8" > . . . < / head>एचटीएमएल 4.01 मधील मानकांमध्ये स्वीकारल्या गेलेल्या नोंदीपेक्षा ही एंट्री अगदी वेगळी आहे, परंतु हळूहळू सादर होत असलेल्या नवीनशी पूर्णपणे सुसंगत आहे. HTML मानक 5, आणि त्यावर वापरल्या जाणाऱ्या कोणालाही ते पूर्णपणे योग्यरित्या समजले जाईल वर्तमान क्षणब्राउझर सिद्धांतानुसार, एन्कोडिंग दर्शविणारा मेटा घटक HTML दस्तऐवजठेवणे चांगले होईल दस्तऐवज शीर्षलेखात शक्य तितक्या उच्चजेणेकरुन मजकुरातील पहिले वर्ण मुलभूत ANSI (जे नेहमी योग्यरितीने आणि कोणत्याही भिन्नतेमध्ये वाचले जातात) मधून येत नसताना, ब्राउझरकडे आधीपासूनच या वर्णांच्या कोडचा अर्थ कसा लावायचा याबद्दल माहिती असणे आवश्यक आहे. प्रथम लिंक

UTF-8 कसे कार्य करते आणि युनिकोड काय आहे हे समजून घेण्याचे कारण म्हणजे UTF-8 सह कार्य करण्यासाठी VBScript मध्ये अंगभूत कार्ये नाहीत. आणि मला काम करणारे काहीही सापडले नाही म्हणून, मला ते स्वतःच लिहावे/समाप्त करावे लागले. माझ्या मते, अनुभव कोणत्याही परिस्थितीत उपयुक्त आहे. अधिक चांगल्या प्रकारे समजून घेण्यासाठी, मी सिद्धांतासह प्रारंभ करू.

युनिकोड बद्दल

युनिकोडच्या आगमनापूर्वी, 8-बिट एन्कोडिंग मोठ्या प्रमाणावर वापरले जात होते, ज्याचे मुख्य तोटे स्पष्ट आहेत:
  • तेथे फक्त 255 वर्ण आहेत, आणि तरीही त्यापैकी काही ग्राफिक नाहीत;
  • दस्तऐवज ज्यामध्ये तयार केला होता त्यापेक्षा वेगळ्या एन्कोडिंगसह उघडण्याची क्षमता;
  • प्रत्येक एन्कोडिंगसाठी फॉन्ट तयार करणे आवश्यक आहे.
म्हणून “ब्रॉड” एन्कोडिंगसाठी एकच मानक तयार करण्याचा निर्णय घेण्यात आला ज्यामध्ये सर्व वर्ण समाविष्ट असतील (प्रथम त्यांना फक्त सामान्य वर्ण समाविष्ट करायचे होते, परंतु नंतर त्यांनी त्यांचे विचार बदलले आणि विदेशी जोडण्यास सुरुवात केली). युनिकोड 1,112,064 कोड पॉइंट्स (16 बिट्सपेक्षा जास्त) वापरतो. सुरुवातीस ASCII ची डुप्लिकेट, आणि नंतर उर्वरित लॅटिन, सिरिलिक, इतर युरोपियन आणि आशियाई चिन्हे. वर्ण नियुक्त करण्यासाठी, पहिल्या 65k साठी "U+xxxx" फॉर्मचे हेक्साडेसिमल नोटेशन वापरा आणि ते मोठ्या संख्येनेउर्वरित संख्या.

UTF-8 बद्दल

मला एकदा वाटले की युनिकोड आहे आणि UTF-8 आहे. नंतर मला कळले की माझी चूक होती.
UTF-8 हे युनिकोडचे फक्त 8-बिट प्रतिनिधित्व आहे. 128 पेक्षा कमी कोड असलेले वर्ण एक बाइट म्हणून दर्शविले जातात आणि युनिकोडमध्ये ते ASCII ची पुनरावृत्ती करत असल्याने, केवळ या वर्णांसह लिहिलेला मजकूर ASCII मजकूर असेल. 128 मधील कोड असलेले वर्ण 2 बाइट्समध्ये एन्कोड केले आहेत, 2048 - 3 मधील कोडसह 65536 - 4 मधील कोड आहेत. त्यामुळे 6 बाइट्स मिळवणे शक्य होईल, परंतु त्यांच्यासह एन्कोड करण्यासाठी काहीही शिल्लक नाही.
0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xx10xx10xx0xx : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

आम्ही UTF-8 मध्ये एन्कोड करतो

प्रक्रिया अंदाजे अशी आहे:
  • आम्ही प्रत्येक अक्षर युनिकोडमध्ये रूपांतरित करतो.
  • चिन्ह कोणत्या श्रेणीचे आहे ते आम्ही तपासतो.
  • जर चिन्ह कोड 128 पेक्षा कमी असेल, तर आम्ही तो न बदलता निकालात जोडतो.
  • जर कॅरेक्टर कोड 2048 पेक्षा कमी असेल, तर आम्ही कॅरेक्टर कोडचे शेवटचे 6 बिट्स आणि पहिले 5 बिट्स घेऊ. आम्ही पहिल्या 5 बिट्समध्ये 0xC0 जोडतो आणि अनुक्रमाचा पहिला बाइट मिळवतो आणि शेवटच्या 6 बिट्समध्ये 0x80 जोडतो आणि दुसरा बाइट मिळवतो. एकत्र करा आणि निकालात जोडा.
  • आम्ही मोठ्या कोडसाठी अशाच प्रकारे सुरू ठेवू शकतो, परंतु जर वर्ण U+FFFF च्या पलीकडे असेल तर आम्हाला UTF-16 सरोगेट्सचा सामना करावा लागेल.
फंक्शन EncodeUTF8(s) Dim i, c, utfc, b1, b2, b3 साठी i=1 ते Len(s) c = ToLong(AscW(Mid(s,i,1))) जर c< 128 Then utfc = chr(c) ElseIf c < 2048 Then b1 = c Mod &h40 b2 = (c - b1) / &h40 utfc = chr(&hC0 + b2) & chr(&h80 + b1) ElseIf c < 65536 And (c < 55296 Or c >57343) नंतर b1 = c Mod &h40 b2 = ((c - b1) / &h40) Mod &h40 b3 = (c - b1 - (&h40 * b2)) / &h1000 utfc = chr(&hE0 + b3) & chr(&h80 + b2 ) & chr(&h80 + b1) अन्यथा " किरकोळ किंवा प्रमुख सरोगेट UTF-16 utfc = Chr(&hEF) आणि Chr(&hBF) आणि Chr(&hBD) EncodeUTF8 = EncodeUTF8 + utfc पुढील एंड फंक्शन फंक्शन ToLong(intVal If)< 0 Then ToLong = CLng(intVal) + &H10000 Else ToLong = CLng(intVal) End If End Function

डीकोडिंग UTF-8

  • आम्ही फॉर्म 11xxxxxx चे पहिले वर्ण शोधत आहोत
  • आम्ही फॉर्म 10xxxxxx चे सर्व त्यानंतरचे बाइट्स मोजतो
  • जर अनुक्रम दोन बाइट्स असेल आणि पहिला बाइट 110xxxxx असेल, तर आम्ही उपसर्ग कापून त्यांना जोडतो, पहिल्या बाइटला 0x40 ने गुणाकार करतो.
  • त्याचप्रमाणे दीर्घ अनुक्रमांसाठी.
  • आम्ही संपूर्ण अनुक्रम सह पुनर्स्थित करतो इच्छित चिन्हयुनिकोड.
फंक्शन DecodeUTF8(s) Dim i, c, n, b1, b2, b3 i = 1 do when i<= len(s) c = asc(mid(s,i,1)) If (c and &hC0) = &hC0 Then n = 1 Do While i + n <= len(s) If (asc(mid(s,i+n,1)) and &hC0) <>&h80 नंतर बाहेर पडा Do End If n = n + 1 लूप जर n = 2 आणि ((c आणि &hE0) = &hC0) नंतर b1 = asc(mid(s,i+1,1)) आणि &h3F b2 = c आणि &h1F c = b1 + b2 * &h40 Elseif n = 3 आणि ((c आणि &hF0) = &hE0) नंतर b1 = asc(mid(s,i+2,1)) आणि &h3F b2 = asc(mid(s,i+1, 1)) आणि &h3F b3 = c आणि &h0F c = b3 * &H1000 + b2 * &H40 + b1 अन्यथा " U+FFFF पेक्षा मोठे वर्ण किंवा चुकीचा क्रम c = &hFFFD संपल्यास s = left(s,i-1) + chrw( c) + mid(s,i+n) Elseif (c आणि &hC0) = &h80 नंतर " अनपेक्षित चालू बाइट s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1) End If i = i + 1 लूप DecodeUTF8 = s एंड फंक्शन

UTF-8 कसे कार्य करते आणि युनिकोड काय आहे हे समजून घेण्याचे कारण म्हणजे UTF-8 सह कार्य करण्यासाठी VBScript मध्ये अंगभूत कार्ये नाहीत. आणि मला काम करणारे काहीही सापडले नाही म्हणून, मला ते स्वतःच लिहावे/समाप्त करावे लागले. माझ्या मते, अनुभव कोणत्याही परिस्थितीत उपयुक्त आहे. अधिक चांगल्या प्रकारे समजून घेण्यासाठी, मी सिद्धांतासह प्रारंभ करू.

युनिकोड बद्दल

युनिकोडच्या आगमनापूर्वी, 8-बिट एन्कोडिंग मोठ्या प्रमाणावर वापरले जात होते, ज्याचे मुख्य तोटे स्पष्ट आहेत:
  • तेथे फक्त 255 वर्ण आहेत, आणि तरीही त्यापैकी काही ग्राफिक नाहीत;
  • दस्तऐवज ज्यामध्ये तयार केला होता त्यापेक्षा वेगळ्या एन्कोडिंगसह उघडण्याची क्षमता;
  • प्रत्येक एन्कोडिंगसाठी फॉन्ट तयार करणे आवश्यक आहे.
म्हणून “ब्रॉड” एन्कोडिंगसाठी एकच मानक तयार करण्याचा निर्णय घेण्यात आला ज्यामध्ये सर्व वर्ण समाविष्ट असतील (प्रथम त्यांना फक्त सामान्य वर्ण समाविष्ट करायचे होते, परंतु नंतर त्यांनी त्यांचे विचार बदलले आणि विदेशी जोडण्यास सुरुवात केली). युनिकोड 1,112,064 कोड पॉइंट्स (16 बिट्सपेक्षा जास्त) वापरतो. सुरुवातीस ASCII आणि नंतर उर्वरित लॅटिन, सिरिलिक आणि इतर युरोपियन आणि आशियाई वर्णांची डुप्लिकेट करते. वर्ण नियुक्त करण्यासाठी, पहिल्या 65k साठी "U+xxxx" फॉर्मचे हेक्साडेसिमल नोटेशन वापरा आणि उर्वरित अंकांसाठी मोठ्या संख्येने वापरा.

UTF-8 बद्दल

मला एकदा वाटले की युनिकोड आहे आणि UTF-8 आहे. नंतर मला कळले की माझी चूक होती.
UTF-8 हे युनिकोडचे फक्त 8-बिट प्रतिनिधित्व आहे. 128 पेक्षा कमी कोड असलेले वर्ण एक बाइट म्हणून दर्शविले जातात आणि युनिकोडमध्ये ते ASCII ची पुनरावृत्ती करत असल्याने, केवळ या वर्णांसह लिहिलेला मजकूर ASCII मजकूर असेल. 128 मधील कोड असलेले वर्ण 2 बाइट्समध्ये एन्कोड केले आहेत, 2048 - 3 मधील कोडसह 65536 - 4 मधील कोड आहेत. त्यामुळे 6 बाइट्स मिळवणे शक्य होईल, परंतु त्यांच्यासह एन्कोड करण्यासाठी काहीही शिल्लक नाही.
0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xx10xx10xx0xx : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

आम्ही UTF-8 मध्ये एन्कोड करतो

प्रक्रिया अंदाजे अशी आहे:
  • आम्ही प्रत्येक अक्षर युनिकोडमध्ये रूपांतरित करतो.
  • चिन्ह कोणत्या श्रेणीचे आहे ते आम्ही तपासतो.
  • जर चिन्ह कोड 128 पेक्षा कमी असेल, तर आम्ही तो न बदलता निकालात जोडतो.
  • जर कॅरेक्टर कोड 2048 पेक्षा कमी असेल, तर आम्ही कॅरेक्टर कोडचे शेवटचे 6 बिट्स आणि पहिले 5 बिट्स घेऊ. आम्ही पहिल्या 5 बिट्समध्ये 0xC0 जोडतो आणि अनुक्रमाचा पहिला बाइट मिळवतो आणि शेवटच्या 6 बिट्समध्ये 0x80 जोडतो आणि दुसरा बाइट मिळवतो. एकत्र करा आणि निकालात जोडा.
  • आम्ही मोठ्या कोडसाठी अशाच प्रकारे सुरू ठेवू शकतो, परंतु जर वर्ण U+FFFF च्या पलीकडे असेल तर आम्हाला UTF-16 सरोगेट्सचा सामना करावा लागेल.
फंक्शन EncodeUTF8(s) Dim i, c, utfc, b1, b2, b3 साठी i=1 ते Len(s) c = ToLong(AscW(Mid(s,i,1))) जर c< 128 Then utfc = chr(c) ElseIf c < 2048 Then b1 = c Mod &h40 b2 = (c - b1) / &h40 utfc = chr(&hC0 + b2) & chr(&h80 + b1) ElseIf c < 65536 And (c < 55296 Or c >57343) नंतर b1 = c Mod &h40 b2 = ((c - b1) / &h40) Mod &h40 b3 = (c - b1 - (&h40 * b2)) / &h1000 utfc = chr(&hE0 + b3) & chr(&h80 + b2 ) & chr(&h80 + b1) अन्यथा " किरकोळ किंवा प्रमुख सरोगेट UTF-16 utfc = Chr(&hEF) आणि Chr(&hBF) आणि Chr(&hBD) EncodeUTF8 = EncodeUTF8 + utfc पुढील एंड फंक्शन फंक्शन ToLong(intVal If)< 0 Then ToLong = CLng(intVal) + &H10000 Else ToLong = CLng(intVal) End If End Function

डीकोडिंग UTF-8

  • आम्ही फॉर्म 11xxxxxx चे पहिले वर्ण शोधत आहोत
  • आम्ही फॉर्म 10xxxxxx चे सर्व त्यानंतरचे बाइट्स मोजतो
  • जर अनुक्रम दोन बाइट्स असेल आणि पहिला बाइट 110xxxxx असेल, तर आम्ही उपसर्ग कापून त्यांना जोडतो, पहिल्या बाइटला 0x40 ने गुणाकार करतो.
  • त्याचप्रमाणे दीर्घ अनुक्रमांसाठी.
  • इच्छित युनिकोड वर्णाने संपूर्ण क्रम बदला.
फंक्शन DecodeUTF8(s) Dim i, c, n, b1, b2, b3 i = 1 do when i<= len(s) c = asc(mid(s,i,1)) If (c and &hC0) = &hC0 Then n = 1 Do While i + n <= len(s) If (asc(mid(s,i+n,1)) and &hC0) <>&h80 नंतर बाहेर पडा Do End If n = n + 1 लूप जर n = 2 आणि ((c आणि &hE0) = &hC0) नंतर b1 = asc(mid(s,i+1,1)) आणि &h3F b2 = c आणि &h1F c = b1 + b2 * &h40 Elseif n = 3 आणि ((c आणि &hF0) = &hE0) नंतर b1 = asc(mid(s,i+2,1)) आणि &h3F b2 = asc(mid(s,i+1, 1)) आणि &h3F b3 = c आणि &h0F c = b3 * &H1000 + b2 * &H40 + b1 अन्यथा " U+FFFF पेक्षा मोठे वर्ण किंवा चुकीचा क्रम c = &hFFFD संपल्यास s = left(s,i-1) + chrw( c) + mid(s,i+n) Elseif (c आणि &hC0) = &h80 नंतर " अनपेक्षित चालू बाइट s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1) End If i = i + 1 लूप DecodeUTF8 = s एंड फंक्शन

(0 ते 127 पर्यंतचे कोड), म्हणजे लॅटिन अक्षरे, संख्या आणि विशेष वर्ण एका बाइटमध्ये एन्कोड केलेले आहेत.

रशियन अक्षरे (सिरिलिक) 16-बिट (डबल-बाइट) कोडद्वारे दर्शविली जातात:

110XXXXXX 10XXXXXX, जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शविते.

युनिकोड जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेयुनिकोड हे अक्षर एन्कोडिंग मानक आहे जे तुम्हाला जवळजवळ सर्व लिखित भाषांमधील वर्णांचे प्रतिनिधित्व करण्यास अनुमती देते. युनिकोडमध्ये दर्शविलेले वर्ण स्वाक्षरी न केलेले पूर्णांक म्हणून एन्कोड केलेले आहेत. या क्रमांकांना आम्ही युनिकोडमध्ये किंवा फक्त कॅरेक्टर कोड म्हणू.

युनिकोडमध्ये संगणकावर वर्णांचे अनेक प्रकार आहेत: UTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE). (इंग्रजी: युनिकोड ट्रान्सफॉर्मेशन फॉरमॅट - UTF). ते कसे एन्कोड केले आहे ते पाहूया UTF-8 जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेपत्र जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेआणि 110 . तिच्या UTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE): 110 - 1046 10 किंवा 0416 16 किंवा 10000 010110 2. 10 बायनरी स्वरूपात ते दोन भागांमध्ये विभागले गेले आहे: पाच डावे बिट्स आणि सहा उजवे बिट्स. डावी बाजू विशेषता सह बाइटला पूरक आहे 10 डबल-बाइट कोड ते कसे एन्कोड केले आहे ते पाहूया 10000. उजव्या बाजूला दोन बिट नियुक्त केले आहेत UTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE)मल्टीबाइट कोड चालू ठेवण्याचे चिन्ह:

110 10000 10 010110 2
010110. अंतिम पत्र कोड

व्ही जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेअसे दिसते:

किंवा D0 96 16 जेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेअशा प्रकारे, रशियन अक्षर दोनदा एन्कोड केले आहे: प्रथम 11-बिटमध्ये UTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE), आणि नंतर 16-बिट UTF-8 वर. UTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE)खालील सारणीमध्ये, कोड व्यतिरिक्त आणिहेक्साडेसिमल क्रमांक प्रणालीमध्ये, कोड दिले जातात दशांश संख्या प्रणालीमध्ये आणि तुलना करण्यासाठी, एन्कोडिंगमध्ये सिरिलिक कोड.

CP-1251
, अन्यथा म्हणतातजेथे X हे सारणीनुसार वर्ण कोड ठेवण्यासाठी बायनरी अंक दर्शवितेUTF-8, UTF-16 (UTF-16BE, UTF-16LE) आणि UTF-32 (UTF-32BE, UTF-32LE)आणि
windows-1251UTF-8 मध्ये सिरिलिक कोड सारणीwindows-1251UTF-8 मध्ये सिरिलिक कोड सारणी
प्रतीक0410 1040 हेक्स.208 144 192
दहा0411 1041 208 145 193
D0900412 1042 बी208 146 194
D0910413 1043 IN208 147 195
D0920414 1044 जी208 148 196
D0930415 1045 डी208 149 197
ते कसे एन्कोड केले आहे ते पाहूया0416 1046 D094208 150 198
0417 1047 D095208 151 199
D0960418 1048 झेड208 152 200
D0970419 1049 आणि208 153 201
D098वाय1050 D099208 154 202
TO041A1051 D09A208 155 203
एल041B1052 D09B208 156 204
एम041C1053 D09C208 157 205
एन041D1054 D09D208 158 206
बद्दल041E1055 D09E208 159 207
पी0420 1056 041F208 160 208
D09F0421 1057 आर208 161 209
D0A00422 1058 सह208 162 210
D0A10423 1059 टी208 163 211
D0A20424 1060 यू208 164 212
D0A30425 1061 एफ208 165 213
D0A40426 1062 एक्स208 166 214
D0A50427 1063 सी208 167 215
D0A60428 1064 एच208 168 216
D0A70429 1065 शे208 169 217
D0A8SCH1066 D0A9208 170 218
कॉमरसंट042A1067 D0AA208 171 219
वाय042B1068 D0AB208 172 220
b042C1069 D0AC208 173 221
042D1070 D0AD208 174 222
यु042E1071 D0AE208 175 223
आय0430 1072 042F208 176 224
D0AF0431 1073 208 177 225
D0B00432 1074 b208 178 226
D0B10433 1075 व्ही208 179 227
D0B20434 1076 जी208 180 228
D0B30435 1077 d208 181 229
D0B40436 1078 e208 182 230
D0B50437 1079 आणि208 183 231
D0B60438 1080 h208 184 232
D0B70439 1081 आणि208 185 233
D0B8व्या1082 D0B9208 186 234
ला043A1083 D0BA208 187 235
l043B1084 D0BB208 188 236
मी043C1085 D0BC208 189 237
n043D1086 D0BD208 190 238
043E1087 D0BE208 191 239
n0440 1088 043F209 128 240
D0BF0441 1089 आर209 129 241
D1800442 1090 सह209 130 242
D1810443 1091 D183209 131 243
f0444 1092 D184209 132 244
एक्स0445 1093 D185209 133 245
ts0446 1094 D186209 134 246
h0447 1095 D187209 135 247
w0448 1096 D188209 136 248
sch0449 1097 D189209 137 249
ъ044A1098 D18A209 138 250
s044B1099 D18B209 139 251
b044C1100 D18C209 140 252
उह044D1101 D18D209 141 253
यू044E1102 D18E209 142 254
आय044F1103 D18F209 143 255
सामान्य नियमाबाहेरील चिन्हे
यो0401 1025 D001208 101 168
e0451 1025 D191209 145 184


आम्ही वाचण्याची शिफारस करतो

वर