सी प्रोग्रामिंग: यूनिकोड के लिए कार्यक्रम कैसे करें?


83

यूनिकोड प्रोग्रामिंग को सख्त करने के लिए और क्या आवश्यक हैं?

क्या इसका मतलब यह है कि मेरे कोड को charकहीं भी प्रकारों का उपयोग नहीं करना चाहिए और उन कार्यों का उपयोग करने की आवश्यकता है जो इससे निपट सकते हैं wint_tऔर wchar_t?

और इस परिदृश्य में मल्टीबाइट चरित्र अनुक्रम द्वारा निभाई गई भूमिका क्या है?

जवाबों:


21

ध्यान दें कि यह "सख्त यूनिकोड प्रोग्रामिंग" के बारे में नहीं है, लेकिन कुछ व्यावहारिक अनुभव है।

हमने अपनी कंपनी में आईबीएम की आईसीयू लाइब्रेरी के आसपास एक रैपर लाइब्रेरी बनाने के लिए क्या किया था। रैपर लाइब्रेरी में UTF-8 इंटरफ़ेस होता है और जब वह ICU को कॉल करना आवश्यक हो तो UTF-16 में परिवर्तित हो जाता है। हमारे मामले में, हमने प्रदर्शन हिट के बारे में बहुत अधिक चिंता नहीं की। जब प्रदर्शन एक मुद्दा था, तो हमने UTF-16 इंटरफेस (अपने स्वयं के डेटाटाइप का उपयोग करके) की आपूर्ति भी की।

अनुप्रयोग काफी हद तक यथावत बने रह सकते हैं (चार का उपयोग करके), हालांकि कुछ मामलों में उन्हें कुछ मुद्दों के बारे में पता होना चाहिए। उदाहरण के लिए, strncpy के बजाय () हम एक आवरण का उपयोग करते हैं जो UTF-8 अनुक्रमों को काटने से बचता है। हमारे मामले में, यह पर्याप्त है, लेकिन कोई पात्रों के संयोजन के लिए जांच पर भी विचार कर सकता है। हमारे पास कोडपॉइंट की संख्या, अंगूर की संख्या आदि की गिनती के लिए रैपर भी हैं।

अन्य प्रणालियों के साथ हस्तक्षेप करते समय, हमें कभी-कभी कस्टम चरित्र संरचना करने की आवश्यकता होती है, इसलिए आपको वहां कुछ लचीलेपन की आवश्यकता हो सकती है (आपके आवेदन के आधार पर)।

हम wchar_t का उपयोग नहीं करते हैं। ICU का उपयोग पोर्टेबिलिटी में अनपेक्षित मुद्दों से बचता है (लेकिन अन्य अनपेक्षित मुद्दों से नहीं, बेशक :-)


2
एक वैध UTF-8 बाइट अनुक्रम को कटा हुआ कभी नहीं (काटकर) काट दिया जाएगा। वैध यूटीएफ -8 अनुक्रमों में कोई 0x00 बाइट्स नहीं हो सकते हैं (बिल्कुल शून्य बाइट को छोड़कर, निश्चित रूप से)।
डैन मोल्डिंग

8
@ डैन मोल्डिंग: यदि आप अकड़ते हैं (), कहते हैं, एक स्ट्रिंग एक एकल चीनी चरित्र (जो 3 बाइट्स हो सकती है) 2-बाइट चार सरणी में, आप एक अमान्य यूटीएफ -8 अनुक्रम बनाते हैं।
हंस वैन एके

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

5
@DanMoulding: यदि आप जानते हैं कि आपका लक्ष्य बफर काफी बड़ा है, तो आप बस उपयोग कर सकते हैं strcpy(जो वास्तव में UTF-8 के साथ उपयोग करने के लिए सुरक्षित है)। उपयोग करने वाले लोग strncpyशायद ऐसा करते हैं क्योंकि उन्हें पता नहीं है कि लक्ष्य बफर काफी बड़ा है, इसलिए वे कॉपी करने के लिए अधिकतम बाइट्स पास करना चाहते हैं - जो वास्तव में अमान्य यूटीएफ -8 अनुक्रम बना सकते हैं।
Frerich Raabe

42

C99 या पहले का

C मानक (C99) विस्तृत वर्णों और मल्टी-बाइट वर्णों के लिए प्रदान करता है, लेकिन चूंकि उन विस्तृत वर्णों के बारे में कोई गारंटी नहीं है, इसलिए उनका मान कुछ सीमित है। किसी दिए गए कार्यान्वयन के लिए, वे उपयोगी सहायता प्रदान करते हैं, लेकिन यदि आपका कोड कार्यान्वयन के बीच स्थानांतरित करने में सक्षम होना चाहिए, तो अपर्याप्त गारंटी है कि वे उपयोगी होंगे।

नतीजतन, हंस वैन एके द्वारा सुझाए गए दृष्टिकोण (जो आईसीयू के चारों ओर एक आवरण लिखने के लिए है - यूनिकोड के लिए अंतर्राष्ट्रीय घटक - पुस्तकालय) ध्वनि, आईएमओ है।

UTF-8 एन्कोडिंग के कई गुण हैं, जिनमें से एक यह है कि यदि आप डेटा के साथ गड़बड़ नहीं करते हैं (उदाहरण के लिए इसे काटकर), तो इसे उन कार्यों द्वारा कॉपी किया जा सकता है जो UTF-8 की पेचीदगियों से पूरी तरह अवगत नहीं हैं एन्कोडिंग। यह स्पष्ट रूप से ऐसा नहीं है wchar_t

पूर्ण में यूनिकोड एक 21-बिट प्रारूप है। यही है, यूनिकोड कोड यू + 0000 से यू + 10 एफएफएफ के लिए आरक्षित करता है।

UTF-8, UTF-16 और UTF-32 स्वरूपों के बारे में उपयोगी चीजों में से एक (जहाँ UTF यूनिकोड परिवर्तन प्रारूप के लिए खड़ा है - यूनिकोड देखें ) यह है कि आप सूचना के नुकसान के बिना तीन अभ्यावेदन के बीच परिवर्तित कर सकते हैं। प्रत्येक का प्रतिनिधित्व कर सकते हैं कुछ भी दूसरों का प्रतिनिधित्व कर सकते हैं। UTF-8 और UTF-16 दोनों बहु-बाइट स्वरूप हैं।

UTF-8 एक बहु-बाइट प्रारूप के रूप में जाना जाता है, एक सावधान संरचना के साथ जो स्ट्रिंग में किसी भी बिंदु पर शुरू करते हुए, एक स्ट्रिंग में पात्रों की शुरुआत को खोजने के लिए संभव बनाता है। एकल-बाइट वर्णों में उच्च-बिट सेट शून्य होता है। मल्टी-बाइट वर्णों में पहला चरित्र एक बिट पैटर्न 110, 1110 या 11110 (2-बाइट, 3-बाइट या 4-बाइट वर्णों के साथ) के साथ शुरू होता है, बाद के बाइट्स हमेशा 10. के साथ शुरू होते हैं। निरंतरता वर्ण हमेशा होते हैं रेंज 0x80 .. 0xBF। ऐसे नियम हैं जो न्यूनतम संभव प्रारूप में UTF-8 वर्णों का प्रतिनिधित्व करते हैं। इन नियमों का एक परिणाम यह है कि बाइट्स 0xC0 और 0xC1 (भी 0xF5..0xFF) मान्य UTF-8 डेटा में प्रकट नहीं हो सकते हैं।

मूल रूप से, यह आशा की गई थी कि यूनिकोड एक 16-बिट कोड सेट होगा और सब कुछ 16-बिट कोड स्थान में फिट होगा। दुर्भाग्य से, वास्तविक दुनिया अधिक जटिल है, और इसे वर्तमान 21-बिट एन्कोडिंग तक विस्तारित किया जाना था।

UTF-16 इस प्रकार 'बेसिक बहुभाषी विमान' के लिए एक एकल इकाई (16-बिट शब्द) कोड सेट है, जिसका अर्थ है यूनिकोड कोड अंक U + 0000 .. U + FFFF के साथ वर्ण, लेकिन दो इकाइयों (32-बिट) का उपयोग करता है इस सीमा के बाहर वर्ण। इस प्रकार, यूटीएफ -16 एन्कोडिंग के साथ काम करने वाले कोड को यूटीएफ -8 की तरह ही चर चौड़ाई के एन्कोडिंग को संभालने में सक्षम होना चाहिए। डबल-यूनिट वर्णों के लिए कोड को सरोगेट कहा जाता है।

यूआरएफ -16 में युग्मित कोड इकाइयों के अग्रणी और अनुगामी मूल्यों के रूप में उपयोग के लिए आरक्षित यूनिकोड मूल्यों की दो विशेष श्रेणियों से सरोगेट्स कोड पॉइंट हैं। अग्रणी, जिन्हें उच्च भी कहा जाता है, सरोगेट U + D800 से U + DBFF तक हैं, और अनुगामी, या निम्न, सरोगेट U + DC00 से U + DFFF तक हैं। उन्हें सरोगेट कहा जाता है, क्योंकि वे सीधे पात्रों का प्रतिनिधित्व नहीं करते हैं, लेकिन केवल एक जोड़ी के रूप में।

बेशक, UTF-32, स्टोरेज की एक इकाई में किसी भी यूनिकोड कोड बिंदु को एनकोड कर सकता है। यह संगणना के लिए कुशल है लेकिन भंडारण के लिए नहीं।

आप ICU और यूनिकोड वेब साइटों पर बहुत अधिक जानकारी पा सकते हैं ।

C11 और <uchar.h>

C11 मानक ने नियमों को बदल दिया, लेकिन सभी कार्यान्वयन अभी भी बदलावों के साथ नहीं पकड़े गए हैं (2017 के मध्य)। C11 मानक यूनिकोड समर्थन के लिए परिवर्तनों का सारांश प्रस्तुत करता है:

  • यूनिकोड वर्ण और तार ( <uchar.h>) (मूल रूप से ISO / IEC TR 19769: 2004 में निर्दिष्ट)

इस प्रकार की कार्यक्षमता की एक न्यूनतम न्यूनतम रूपरेखा है। विनिर्देश में शामिल हैं:

6.4.3 सार्वभौमिक चरित्र नाम

सिंटेक्स
यूनिवर्सल-कैरेक्टर-नाम:
    \u हेक्स-क्वाड
    \U हेक्स-क्वाड हेक्स-क्वाड
हेक्स-क्वाड:
    हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट

7.28 यूनिकोड उपयोगिताओं <uchar.h>

शीर्ष लेख <uchar.h>यूनिकोड वर्णों में हेरफेर करने के लिए प्रकारों और कार्यों की घोषणा करता है।

घोषित प्रकार mbstate_t(7.29.1 में वर्णित हैं ) और size_t(7.19 में वर्णित);

जो 16-बिट वर्णों के लिए उपयोग किया गया एक अहस्ताक्षरित पूर्णांक प्रकार है और उसी प्रकार है जैसा uint_least16_t(7.20.1.2 में वर्णित है); तथा

जो 32-बिट वर्णों के लिए उपयोग किया गया एक अहस्ताक्षरित पूर्णांक प्रकार है और यह उसी प्रकार है जैसे uint_least32_t(7.20.1.2 में वर्णित है)।

(अनुवाद कर रहा है पार संदर्भ: <stddef.h>परिभाषित करता है size_t, <wchar.h>परिभाषित करता है mbstate_t, और <stdint.h>परिभाषित करता है uint_least16_tऔर uint_least32_t।) <uchar.h>हैडर भी (restartable) रूपांतरण कार्यों का एक न्यूनतम सेट को परिभाषित करता है:

  • mbrtoc16()
  • c16rtomb()
  • mbrtoc32()
  • c32rtomb()

ऐसे नियम हैं जिनके बारे में यूनिकोड वर्णों का उपयोग पहचानकर्ताओं में \unnnnया \U00nnnnnnनोटेशन का उपयोग करके किया जा सकता है। आपको पहचानकर्ताओं में ऐसे पात्रों के समर्थन को सक्रिय रूप से सक्रिय करना पड़ सकता है। उदाहरण के लिए, जीसीसी को -fextended-identifiersपहचानकर्ताओं में इन्हें अनुमति देने की आवश्यकता होती है।

ध्यान दें कि macOS Sierra (10.12.5), नाम के लिए लेकिन एक प्लेटफॉर्म का समर्थन नहीं करता है <uchar.h>


3
मुझे लगता है कि आप यहां बेच रहे हैं wchar_tऔर दोस्त थोड़े कम हैं। सी लाइब्रेरी को किसी भी एन्कोडिंग (गैर-यूनिकोड एन्कोडिंग सहित) में पाठ को संभालने की अनुमति देने के लिए ये प्रकार आवश्यक हैं । विस्तृत वर्ण प्रकार और कार्यों के बिना, सी लाइब्रेरी को हर समर्थित एन्कोडिंग के लिए टेक्स्ट-हैंडलिंग फ़ंक्शंस के सेट की आवश्यकता होगी : KO8len, koi8tok, koi8printf को KOI-8 एन्कोडेड पाठ के लिए, और utf8tok, utf8tok, UTF-8 के लिए utf8printf की कल्पना करें पाठ। इसके बजाय, हम बस के लिए भाग्यशाली रहे हैं एक इन कार्यों (मूल ASCII लोगों की गिनती नहीं) के सेट: wcslen, wcstok, और wprintf
डेन मोल्डिंग

1
सभी प्रोग्रामर को करने के लिए mbstowcsकिसी भी समर्थित एन्कोडिंग को परिवर्तित करने के लिए सी लाइब्रेरी चरित्र रूपांतरण फ़ंक्शन ( और दोस्तों) का उपयोग करना होगा wchar_t। एक बार wchar_tप्रारूप में, प्रोग्रामर विस्तृत पाठ हैंडलिंग कार्यों के एकल सेट का उपयोग कर सकता है जो सी लाइब्रेरी प्रदान करता है। एक अच्छा सी लाइब्रेरी कार्यान्वयन वस्तुतः किसी भी एन्कोडिंग का समर्थन करेगा जो कि ज्यादातर प्रोग्रामर को कभी भी ज़रूरत होगी (मेरे सिस्टम में से एक पर, मुझे 221 अद्वितीय एनकोडिंग की पहुंच है)।
डैन मोल्डिंग

जहां तक ​​कि क्या वे उपयोगी होने के लिए पर्याप्त विस्तृत होंगे: मानक को एक कार्यान्वयन की आवश्यकता होती है जो wchar_tकिसी भी चरित्र को लागू करने के लिए पर्याप्त विस्तृत होनी चाहिए । इसका मतलब है (संभवतः एक उल्लेखनीय अपवाद के साथ) अधिकांश कार्यान्वयन यह सुनिश्चित करेंगे कि वे पर्याप्त विस्तृत हैं जो एक प्रोग्राम का उपयोग करता wchar_tहै जो सिस्टम द्वारा समर्थित किसी भी एन्कोडिंग को संभाल लेगा (माइक्रोसॉफ्ट wchar_tकेवल 16-बिट चौड़ा है जिसका अर्थ है कि उनका कार्यान्वयन सभी एन्कोडिंग का पूरी तरह से समर्थन नहीं करता है, विशेष रूप से विभिन्न यूटीएफ एन्कोडिंग, लेकिन उनका अपवाद नियम नहीं है)।
डैन मोल्डिंग

11

यह FAQ जानकारी का खजाना है। जोएल स्पोलस्की के उस पृष्ठ और इस लेख के बीच , आपके पास एक अच्छी शुरुआत होगी।

एक निष्कर्ष मैं रास्ते में आया:

  • wchar_tविंडोज पर 16 बिट्स हैं, लेकिन जरूरी नहीं कि अन्य प्लेटफॉर्म पर 16 बिट्स हों। मुझे लगता है कि यह विंडोज पर एक आवश्यक बुराई है, लेकिन शायद कहीं और टाला जा सकता है। विंडोज पर महत्वपूर्ण कारण यह है कि आपको उन फ़ाइलों का उपयोग करने की आवश्यकता है जिनके नाम में गैर-एएससीआईआई अक्षर हैं (कार्यों के डब्ल्यू संस्करण के साथ)।

  • ध्यान दें कि wchar_tस्ट्रिंग्स को लेने वाले Windows API, UTF-16 एन्कोडिंग की अपेक्षा करते हैं। यह भी ध्यान दें कि यह UCS-2 से भिन्न है। सरोगेट जोड़े का ध्यान रखें। इस परीक्षण पृष्ठ में ज्ञानवर्धक परीक्षण हैं।

  • आप Windows पर हैं प्रोग्रामिंग, आप उपयोग नहीं कर सकते fopen(), fread(), fwrite(), आदि के बाद से वे केवल लेने char *और समझ में नहीं आता UTF-8 एन्कोडिंग। पोर्टेबिलिटी को दर्दनाक बनाता है।


ध्यान दें कि stdio f*और दोस्त हर प्लेटफॉर्म char *पर काम करते हैं क्योंकि मानक ऐसा कहता है - wchar_t के बजाय उपयोग करें । wcs*
बिल्ली

7

सख्त यूनिकोड प्रोग्रामिंग करने के लिए:

  • केवल स्ट्रिंग एपीआई हैं कि का उपयोग यूनिकोड बारे में पता ( नहीं strlen , strcpy... लेकिन उनके widestring समकक्षों wstrlen, wsstrcpy, ...)
  • पाठ के एक ब्लॉक के साथ काम करते समय, एक एन्कोडिंग का उपयोग करें जो बिना नुकसान के यूनिकोड चार्ट (utf-7, utf-8, utf-16, ucs-2, ...) को संग्रहीत करने की अनुमति देता है।
  • जांचें कि आपका OS डिफ़ॉल्ट वर्ण सेट यूनिकोड संगत है (उदा: utf-8)
  • उन फोंट का उपयोग करें जो यूनिकोड संगत हैं (जैसे arial_unicode)

मल्टी-बाइट चरित्र अनुक्रम एक एन्कोडिंग है जो UTF-16 एन्कोडिंग (सामान्य रूप से उपयोग किया जाने वाला wchar_t) से पूर्व-तिथि करता है और मुझे ऐसा लगता है कि यह केवल विंडोज़ है।

मैंने कभी नहीं सुना wint_t


wint_t <wchar.h> में परिभाषित एक प्रकार है, जैसे wchar_t है। इसमें व्यापक चरित्रों के संबंध में वही भूमिका है जो इंट के पास 'चार' के संबंध में है; यह किसी भी व्यापक चरित्र मूल्य या WEOF धारण कर सकता है।
जोनाथन लेफ़लर

3

सबसे महत्वपूर्ण बात यह है कि पाठ और बाइनरी डेटा के बीच हमेशा स्पष्ट अंतर करना चाहिएपायथन 3.x strबनामbytes या SQL TEXTबनाम के मॉडल का पालन करने का प्रयास करें BLOB

दुर्भाग्य से, सी char"ASCII चरित्र" और दोनों के लिए उपयोग करके समस्या को भ्रमित करता है int_least8_t। आप कुछ ऐसा करना चाहेंगे:

आप यूटीएफ -16 और यूटीएफ -32 कोड इकाइयों के लिए भी टाइप किएडिफ्स चाहते हैं, लेकिन यह अधिक जटिल है क्योंकि इनकोडिंग को wchar_tपरिभाषित नहीं किया गया है। आपको सिर्फ एक प्रीप्रोसेसर की आवश्यकता होगी #if। C और C ++ 0x में कुछ उपयोगी मैक्रो हैं:

  • __STDC_UTF_16__- यदि परिभाषित किया गया है, तो प्रकार _Char16_tमौजूद है और UTF-16 है।
  • __STDC_UTF_32__- यदि परिभाषित किया गया है, तो प्रकार _Char32_tमौजूद है और UTF-32 है।
  • __STDC_ISO_10646__- यदि परिभाषित किया गया है, तो wchar_tUTF-32 है।
  • _WIN32- विंडोज पर, wchar_tयूटीएफ -16 है, भले ही यह मानक को तोड़ता है।
  • WCHAR_MAX- का आकार निर्धारित करने के लिए इस्तेमाल किया जा सकता है wchar_t, लेकिन यह नहीं कि ओएस यूनिकोड का प्रतिनिधित्व करने के लिए इसका उपयोग करता है या नहीं।

क्या इसका मतलब यह है कि मेरे कोड को कहीं भी चार प्रकार का उपयोग नहीं करना चाहिए और उन कार्यों का उपयोग करने की आवश्यकता है जो wint_t और wchar_t से निपट सकते हैं?

यह सभी देखें:

यूटीएफ -8 एक पूरी तरह से वैध यूनिकोड एन्कोडिंग है जो char*तारों का उपयोग करता है । इसका यह लाभ है कि यदि आपका प्रोग्राम गैर-एएससीआईआई बाइट्स (जैसे कि एक लाइन समाप्त करने वाला कन्वर्टर, जो काम करता है \rऔर \nअन्य पात्रों के माध्यम से अपरिवर्तित होता है) के लिए पारदर्शी होता है , तो आपको बिल्कुल भी बदलाव करने की आवश्यकता नहीं होगी

यदि आप UTF-8 के साथ जाते हैं, तो आपको उन सभी मान्यताओं को बदलना होगा जो char= वर्ण (जैसे, toupperलूप में कॉल न करें ) या char= स्क्रीन कॉलम (जैसे, टेक्स्ट रैपिंग के लिए)।

यदि आप UTF-32 के साथ जाते हैं, तो आपके पास निश्चित-चौड़ाई वाले वर्णों की सादगी होगी (लेकिन निश्चित-चौड़ाई वाले अंगूर नहीं हैं , लेकिन आपके सभी तारों के प्रकार को बदलने की आवश्यकता होगी)।

आप UTF-16 के साथ जाना है, तो आप दोनों निश्चित-चौड़ाई वर्ण की धारणा को छोड़ना होगा और 8 बिट कोड इकाइयों की धारणा है, जो इस एकल-बाइट एन्कोडिंग से सबसे कठिन उन्नयन पथ बनाता है।

मैं सक्रिय रूप से बचने की सिफारिश करूंगा wchar_tक्योंकि यह क्रॉस-प्लेटफ़ॉर्म नहीं है: कभी-कभी यह यूटीएफ -32, कभी-कभी यह यूटीएफ -16 है, और कभी-कभी यह एक पूर्व-यूनिकोड पूर्व एशियाई एन्कोडिंग है। मैं उपयोग करने की सलाह दूंगाtypedefs

इससे भी महत्वपूर्ण बात, से बचेंTCHAR


मुझे नहीं लगता कि यह दुर्भाग्यपूर्ण है - चार एक इंट। यह एक लाभ है। शाब्दिक वर्ण स्थिरांक के उपयोग के रूप में दिमाग में आता है। और फ़ंक्शंस जो एक char *समस्या ले सकते हैं यदि const char *मुझे याद किया गया एक अंतिम पारित किया गया (लेकिन मैं इस पर अस्पष्ट हूं और जो कार्य करता है तो इसे एक चुटकी नमक के साथ लें)। सिर्फ इसलिए कि यह अन्य भाषाओं के साथ अधिक जटिल है इसका मतलब यह नहीं है कि यह एक खराब डिजाइन है।
प्रिवेतन

2

मैं किसी भी मानक पुस्तकालय कार्यान्वयन पर भरोसा नहीं करेगा। बस अपने स्वयं के यूनिकोड प्रकारों को रोल करें।


2

आप मूल रूप से स्मृति में तार के साथ wchar_tसरणियों के बजाय सौदा करना चाहते हैं । जब आप किसी भी प्रकार के I / O (जैसे पढ़ने / लिखने की फाइलें) करते हैं, तो आप UTF-8 (यह संभवतः सबसे आम एन्कोडिंग) का उपयोग करके डिकोड / डिकोड कर सकते हैं, जो लागू करने के लिए पर्याप्त सरल है। बस RFC को google करें। तो इन-मेमोरी कुछ भी मल्टी-बाइट नहीं होना चाहिए। एक wchar_tचरित्र का प्रतिनिधित्व करता है। हालांकि, जब आप क्रमबद्ध करने के लिए आते हैं, तो जब आपको UTF-8 जैसी किसी चीज़ को एनकोड करना होता है, जहां कुछ पात्रों को कई बाइट्स द्वारा दर्शाया जाता है।

strcmpविस्तृत चरित्र तार के लिए आपको नए संस्करण आदि भी लिखने होंगे , लेकिन यह कोई बड़ा मुद्दा नहीं है। सबसे बड़ी समस्या पुस्तकालयों / मौजूदा कोड के साथ होगी जो केवल चार सरणियों को स्वीकार करते हैं।

और जब यह आता है sizeof(wchar_t)(आपको 4 बाइट्स की आवश्यकता होगी यदि आप इसे सही करना चाहते हैं) तो आप इसे कभी भी बड़े आकार में typedef/ macroहैक्स के साथ फिर से परिभाषित कर सकते हैं यदि आपको आवश्यकता है।


1

मुझे जो पता है, उससे wchar_t कार्यान्वयन निर्भर है (जैसा कि इस विकी लेख से देखा जा सकता है )। और यह यूनिकोड नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.