दिलचस्प पोस्ट
एक्सएमएल को जेएसओएन में जावा में परिवर्तित करने का सबसे तेज़ तरीका PHP में एसिंक्रोनस शैल एप एक वीडियो यूआरएल से थंबनेल या आईफोन एसडीके में डेटा प्राप्त करना $ की डिफरेड की एक सरणी में पास करें। जब () क्या कारण है और NoClassDefFoundError और ClassNotFoundException के बीच अंतर क्या हैं? बीच में रिक्त स्थान सहित VBA में प्रयुक्त अंतिम पंक्ति का निर्धारण कैसे करें एसडी कार्ड पर लिखने की अनुमति नोड वस्तु और तत्व ऑब्जेक्ट के बीच का अंतर? क्या स्विफ्ट में पहुंच संशोधक हैं? समस्याओं को छवि स्रोत के रूप में सेट किया गया था, जब ओवरराइटिंग (पुनः-बचत) छवि किसी भी जावा कचरा संग्रह लॉग विश्लेषण उपकरण का पता? बैश: तारों के साथ जोड़ तोड़ (प्रतिशत चिन्ह) एक खोल पाइप में त्रुटि कोड पकड़ना एसवीजी जेक्टीआइ और जेक्वीरी-एसवीजी का उपयोग कर खींचें क्या डीमन के लिए PHP का उपयोग करना बुद्धिमान है?

सी ++ 11 में यूनिकोड कितनी अच्छी तरह समर्थित है?

मैंने पढ़ा और सुना है कि सी ++ 11 यूनिकोड का समर्थन करता है उस पर कुछ सवाल:

  • सी ++ मानक पुस्तकालय यूनिकोड को कितनी अच्छी तरह समर्थन करता है?
  • क्या std::string करता है कि यह क्या करना चाहिए?
  • मैं इसे कैसे इस्तेमाल करूं?
  • संभावित समस्याएं कहां हैं?

वेब के समाधान से एकत्रित समाधान "सी ++ 11 में यूनिकोड कितनी अच्छी तरह समर्थित है?"

सी ++ मानक पुस्तकालय यूनिकोड को कितनी अच्छी तरह समर्थन करता है?

बहुत।

यूनिकोड समर्थन प्रदान करने वाली पुस्तकालय सुविधाओं के माध्यम से एक त्वरित स्कैन मुझे यह सूची देता है:

  • तार पुस्तकालय
  • स्थानीयकरण पुस्तकालय
  • इनपुट / आउटपुट लाइब्रेरी
  • नियमित अभिव्यक्ति पुस्तकालय

मुझे लगता है कि सभी लेकिन सबसे पहले एक भयानक समर्थन प्रदान करते हैं। आपके अन्य सवालों के माध्यम से त्वरित चक्कर के बाद मैं इसे और अधिक विस्तार से वापस मिलूँगा

क्या std::string करता है कि यह क्या करना चाहिए?

हाँ। सी ++ मानक के अनुसार, यह std::string और उसके भाई-बहन को करना चाहिए:

क्लास टेम्प्लेट basic_string ऑब्जेक्ट्स का वर्णन करता है जो क्रम शून्य पर अनुक्रम के पहले तत्व के साथ मनमाना वाले चार-जैसे ऑब्जेक्ट की एक अलग संख्या से मिलकर अनुक्रम को संग्रहीत कर सकता है।

अच्छी तरह से, std::string है कि बस ठीक है। क्या यह कोई यूनिकोड-विशिष्ट कार्यक्षमता प्रदान करता है? नहीं।

इसे होना चाहिए? शायद ऩही। std::string char ऑब्जेक्ट के अनुक्रम के रूप में ठीक है यह उपयोगी है; एकमात्र झुंझलाहट यह है कि यह पाठ का एक बहुत ही कम-स्तर वाला दृश्य है और मानक C ++ उच्च-स्तरीय एक नहीं प्रदान करता है

मैं इसे कैसे इस्तेमाल करूं?

इसे char वस्तुओं के अनुक्रम के रूप में प्रयोग करें; इसका नाटक करते हुए कुछ और दर्द में अंत करने के लिए बाध्य है।

संभावित समस्याएं कहां हैं?

सभी जगह? चलो देखते हैं…

तार पुस्तकालय

स्ट्रिंग लाइब्रेरी हमें basic_string स्ट्रिंग प्रदान करती है, जो मानक कॉल "चार-जैसे ऑब्जेक्ट्स" का एक अनुक्रम है। मैं उन्हें कोड इकाइयां कहता हूं। यदि आप पाठ का एक उच्च-स्तरीय दृश्य चाहते हैं, तो ऐसा नहीं है जो आप के लिए देख रहे हैं। यह सीरियलाइजेशन / डेसरियालाइजेशन / स्टोरेज के लिए उपयुक्त पाठ का एक दृश्य है।

यह सी लाइब्रेरी से कुछ उपकरण भी प्रदान करता है जो संकीर्ण दुनिया और यूनिकोड दुनिया के बीच के अंतर को कम करने के लिए इस्तेमाल किया जा सकता है: c16rtomb / mbrtoc16 और c32rtomb / mbrtoc32

स्थानीयकरण पुस्तकालय

स्थानीयकरण पुस्तकालय अब भी मानते हैं कि उन में से एक "चार-जैसे ऑब्जेक्ट्स" एक "वर्ण" के बराबर है यह निश्चित रूप से मूर्खतापूर्ण है, और बहुत सी चीजें प्राप्त करना असंभव बनाता है जैसे कि एएससीआईआई जैसे यूनिकोड के कुछ छोटे सबसेट से परे काम करना

उदाहरण के लिए, <locale> शीर्ष लेख में मानक कॉल "सुविधा इंटरफेस" पर विचार करें,

 template <class charT> bool isspace (charT c, const locale& loc); template <class charT> bool isprint (charT c, const locale& loc); template <class charT> bool iscntrl (charT c, const locale& loc); // ... template <class charT> charT toupper(charT c, const locale& loc); template <class charT> charT tolower(charT c, const locale& loc); // ... 

यू 8 u8"🍌" या यू 8 u8"\U0001F34C" रूप में आप इन कार्यों में से किसी को ठीक तरह से वर्गीकृत करने के लिए कैसे कह सकते हैं, यू + 1 एफ 34 सी ʙᴀɴᴀɴᴀ? यह कभी भी काम नहीं करेगा, क्योंकि ये फ़ंक्शन इनपुट के रूप में केवल एक कोड इकाई लेता है।

यदि आप केवल char32_t उपयोग करते हैं तो यह एक उपयुक्त स्थान के साथ काम कर सकता है: U'\U0001F34C' यूटीएफ -32 में एक एकल कोड इकाई है

हालांकि, यह अभी भी इसका मतलब है कि आप केवल tolower और tolower साथ सरल आवरण परिवर्तन प्राप्त करते हैं, उदाहरण के लिए, कुछ जर्मन लोकेल के लिए पर्याप्त नहीं हैं: "एसएस" के ऊपरी भाग को "एसएस" लेकिन toupper केवल एक वर्ण कोड इकाई को वापस कर सकते हैं।

अगला, wstring_convert / wbuffer_convert और मानक कोड रूपांतरण पहलू

wstring_convert का उपयोग स्ट्रिंग्स में दिए गए एन्कोडिंग में दिए गए एन्कोडिंग में स्ट्रिंग्स के बीच कन्वर्ट करने के लिए किया जाता है इस रूपांतरण में दो स्ट्रिंग प्रकार शामिल हैं, जो मानक को एक बाइट स्ट्रिंग और एक विस्तृत स्ट्रिंग कहते हैं। चूंकि ये शब्द वाकई भ्रामक हैं, मैं क्रमशः "क्रमबद्ध" और "deserialized" का उपयोग करना पसंद करता हूं, इसके बजाय

के बीच कन्वर्ट करने के लिए एन्कोडिंग एक codecvt (एक कोड रूपांतरण पहलू) द्वारा तय किया जाता है जो wstring_convert लिए एक टेम्पलेट प्रकार तर्क के रूप में पारित किया जाता है।

wbuffer_convert एक समान फ़ंक्शन करता है लेकिन एक विस्तृत deserialized स्ट्रीम बफ़र के रूप में जो एक बाइट धारावाहिक स्ट्रीम बफ़र को लपेटता है। किसी भी आई / ओ को अंतर्निहित बाइट धारावाहिक स्ट्रीम बफ़र के माध्यम से रूपांतरण के साथ और कोडेकल्टी तर्क द्वारा दिए गए एन्कोडिंग से किया जाता है। उस बफर में सीरियलाइज लिखना, और फिर इसे से लिखा जाता है, और पढ़ना बफर में पढ़ता है और उसके बाद से इसे हटाता है

मानक इन सुविधाओं के साथ उपयोग करने के लिए कुछ कोडेकवेट क्लास टेम्प्लेट प्रदान करता है: codecvt_utf8 , codecvt_utf16 , codecvt_utf8_utf16 और कुछ codecvt_utf8_utf16 विशेषज्ञ। इन मानक पहलुओं के साथ-साथ सभी निम्नलिखित रूपांतरण प्रदान करते हैं। (नोट: निम्न सूची में, बाईं ओर एन्कोडिंग हमेशा सीरियल की गई स्ट्रिंग / स्ट्रीमबुफ़ है, और दाईं ओर एन्कोडिंग हमेशा deserialized स्ट्रिंग / स्ट्रीमबफ है; मानक दोनों दिशाओं में रूपांतरण की अनुमति देता है)।

  • यूटीएफ -8 ↔ codecvt_utf8<char16_t> -2 codecvt_utf8<char16_t> 8 codecvt_utf8<char16_t> , और codecvt_utf8<wchar_t> जहां sizeof(wchar_t) == 2 ;
  • यूटीएफ -8 ↔ यूटीएफ -32 को codecvt_utf8<char32_t> , codecvt_utf8<char32_t> codecvt<char32_t, char, mbstate_t> , और codecvt_utf8<wchar_t> जहां sizeof(wchar_t) == 4 ;
  • UTF-16 ↔ codecvt_utf16<char16_t> -2 codecvt_utf16<char16_t> 16 codecvt_utf16<char16_t> , और codecvt_utf16<wchar_t> जहां sizeof(wchar_t) == 2 ;
  • UTF-16 ↔ यूटीएफ -32 को codecvt_utf16<char32_t> 16 codecvt_utf16<char32_t> , और codecvt_utf16<wchar_t> जहां sizeof(wchar_t) == 4 ;
  • यूटीएफ -8 ↔ UTF-16 codecvt_utf8_utf16<char16_t> , codecvt<char16_t, char, mbstate_t> , और codecvt_utf8_utf16<wchar_t> जहां sizeof(wchar_t) == 2 ;
  • codecvt<wchar_t, char_t, mbstate_t> साथ संकीर्ण विस्तृत
  • codecvt<char, char, mbstate_t> साथ नो-ऑप

इनमें से कई उपयोगी हैं, लेकिन यहां कई अजीब सामान हैं।

सबसे पहले बंद उच्च उच्च किराए पर! नामकरण योजना गन्दा है

फिर, बहुत सारे UCS-2 समर्थन हैं। यूसीएस -2 यूनिकोड 1.0 से एन्कोडिंग है जिसे 1 99 6 में स्थान दिया गया था क्योंकि यह केवल मूल बहुभाषी विमान का समर्थन करता है। क्यों समिति ने एक एन्कोडिंग पर ध्यान केंद्रित करने के लिए वांछनीय विचार किया जो 20 साल पहले खत्म हो गया था, मुझे नहीं पता और डैडिगर; । यह अधिक एन्कोडिंग के लिए समर्थन की तरह खराब नहीं है या कुछ भी नहीं है, लेकिन यूसीएस -2 बहुत बार यहां दिखाता है

मैं कहूंगा कि char16_t स्पष्ट रूप से यूटीएफ -16 कोड इकाइयों को संग्रहीत करने के लिए है। हालांकि, यह मानक का एक हिस्सा है जो अन्यथा सोचता है। codecvt_utf8<char16_t> यूटीएफ -16 के साथ कुछ नहीं करना है उदाहरण के लिए, wstring_convert<codecvt_utf8<char16_t>>().to_bytes(u"\U0001F34C") ठीक संकलित करेगा, लेकिन बिना शर्त पर असफल हो जायेगा: इनपुट को यूसीएस -2 स्ट्रिंग u"\xD83C\xDF4C" रूप में माना जाएगा, जो UTF-8 में परिवर्तित नहीं किया जा सकता क्योंकि यूटीएफ -8 0xD800-0xDFFF सीमा में किसी भी मूल्य को एन्कोड नहीं कर सकता है।

अभी भी यूसीएस -2 के सामने, यूटीएफ -16 स्ट्रीम से इन पहलुओं के साथ यूटीएफ -16 स्ट्रिंग में पढ़ने का कोई रास्ता नहीं है। यदि आपके पास UTF-16 बाइट्स का अनुक्रम है तो आप उसे char16_t स्ट्रिंग में char16_t नहीं कर सकते, उदाहरण के लिए। यह आश्चर्य की बात है, क्योंकि यह अधिक से कम एक पहचान रूपांतरण है। यहां तक ​​कि अधिक आश्चर्य की बात यह है कि यह तथ्य है कि यूटीएफ -16 स्ट्रीम से यूसीएस -2 स्ट्रिंग में codecvt_utf16<char16_t> लिए deserializing समर्थन है, जो वास्तव में एक हानिपूर्ण रूपांतरण है।

UTF-16-as-bytes समर्थन काफी अच्छा है, यद्यपि: यह एक BOM से endianess का पता लगाने, या कोड में स्पष्ट रूप से चयन का समर्थन करता है। यह एक BOM के साथ और बिना आउटपुट उत्पादन का समर्थन करता है।

अनुपस्थित कुछ और दिलचस्प रूपांतरण संभावनाएं हैं UTF-16 स्ट्रीम या स्ट्रिंग को यूटीएफ -8 स्ट्रिंग में स्थानांतरित करने का कोई रास्ता नहीं है, चूंकि यूटीएफ -8 को deserialized रूप के रूप में कभी समर्थित नहीं किया जाता है।

और यहां संकीर्ण / व्यापक दुनिया यूटीएफ / यूसीएस दुनिया से पूरी तरह अलग है। पुरानी शैली के संकीर्ण / विस्तृत एनकोडिंग और यूनिकोड एन्कोडिंग के बीच कोई रूपांतरण नहीं है।

इनपुट / आउटपुट लाइब्रेरी

I / O लाइब्रेरी को ऊपर वर्णित wstring_convert और wbuffer_convert सुविधा का उपयोग कर यूनिकोड एन्कोडिंग में टेक्स्ट पढ़ने और लिखने के लिए इस्तेमाल किया जा सकता है। मुझे नहीं लगता कि वहाँ बहुत अधिक है जो कि मानक पुस्तकालय के इस हिस्से द्वारा समर्थित होना चाहिए।

नियमित अभिव्यक्ति पुस्तकालय

मैंने सी ++ रेगेक्सस और यूनिकोड के साथ स्टैक अतिप्रवाह से पहले समस्याओं का खुलासा किया है मैं उन सभी बिंदुओं को दोहराना नहीं दूंगा, लेकिन केवल यह बताता हूं कि सी ++ रीजजेक्स के पास स्तर 1 यूनिकोड का समर्थन नहीं है, जो हर जगह यूटीएफ -32 का प्रयोग करने के बिना उन्हें प्रयोग करने योग्य बनाने के लिए न्यूनतम है।

बस?

हाँ बस यही। यही मौजूदा कार्यक्षमता है यहां बहुत सारी यूनिकोड कार्यक्षमताएं हैं, जो कहीं नॉर्मनाइलाइज़ेशन या टेक्स्ट सेगमेंट एल्गोरिदम की तरह नहीं देखी जा सकती हैं।

U + 1F4A 9 क्या सी + + में बेहतर यूनिकोड समर्थन पाने का कोई तरीका है?

सामान्य संदिग्ध: आईसीयू और बूस्ट । लोकल ।


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

यूटीएफ -16 जैसी एन्कोडिंग को char16_t अनुक्रम के रूप में संग्रहित किया जा सकता है, जिसके बाद कोई अंत नहीं होता है; या उन्हें बाइट्स के अनुक्रम के रूप में संग्रहित किया जा सकता है, जो अंतहीनता (प्रत्येक बाइट्स की लगातार जोड़ी char16_t आधार पर अलग-अलग char16_t मूल्य का प्रतिनिधित्व कर सकते हैं) मानक इन दोनों रूपों का समर्थन करता है कार्यक्रम में आंतरिक char16_t के लिए char16_t का अनुक्रम अधिक उपयोगी है। बाइट्स का एक क्रम बाहरी दुनिया के साथ ऐसी तारों का आदान-प्रदान करने का तरीका है मैं "बाइट" और "चौड़े" के बजाय शब्दों का उपयोग करूँगा, इस प्रकार "क्रमबद्ध" और "deserialized" हैं

और ddagger; अगर आप कह रहे हैं "लेकिन विंडोज!" अपना 🐎🐎 रखें विंडोज 2000 के बाद से विंडोज़ के सभी संस्करण यूटीएफ -16 उपयोग करते हैं

यूनिकोड मानक पुस्तकालय (समर्थित किसी भी उचित अर्थ के लिए) द्वारा समर्थित नहीं है

std::string std::vector<char> से बेहतर नहीं है: यह यूनिकोड (या कोई अन्य प्रतिनिधित्व / एन्कोडिंग) के लिए पूरी तरह से अनजान है और बस अपनी सामग्री को बाइट्स के एक धब्बे के रूप में इस्तेमाल करते हैं।

यदि आपको केवल ब्लॉप्स को स्टोर और बिछाने की आवश्यकता है, तो यह बहुत अच्छी तरह से काम करता है; लेकिन जैसे ही आप यूनिकोड कार्यक्षमता (कोड बिंदुओं की संख्या, ग्राफ़म्स की संख्या, …) के लिए इच्छा रखते हैं, आप भाग्य से बाहर हैं।

मैं इसके लिए एकमात्र व्यापक पुस्तकालय जानता हूं जो आईसीयू है I सी + + इंटरफ़ेस जावा से एक से लिया गया था, हालांकि, यह मुहावरेदार होने से बहुत दूर है।

आप युनिकोड एनयूएल (यू + 0000) यूटीएफ -8 में एक रिक्त बाइट है, इस तथ्य की वजह से आप सुरक्षित रूप से यूटीएफ -8 को एक std::string (या एक char[] या char* char[] रख सकते हैं) और यह एकमात्र तरीका है कि यूटीएफ -8 में एक रिक्त बाइट हो सकती है। इसलिए, आपके UTF-8 स्ट्रिंग्स को सभी सी और सी ++ स्ट्रिंग फ़ंक्शंस के अनुसार ठीक से समाप्त किया जाएगा, और आप उन्हें C ++ iostreams ( std::cout और std::cerr सहित) के साथ घूम सकते हैं, जब तक आपके लोकेल यूटीएफ -8)।

क्या आप यूटीएफ -8 के लिए std::string साथ नहीं कर सकते, कोड बिंदुओं में लम्बा हो। std::string::size() आपको बाइट्स में स्ट्रिंग की लंबाई बताएगा, जो कि केवल यूटीएफ -8 के एएससीआईआई सबसेट के भीतर होने वाले कोड बिंदुओं के बराबर है।

यदि आपको कोड बिंदु स्तर पर यूटीएफ -8 स्ट्रिंग्स पर काम करना है — न सिर्फ उन्हें स्टोर और प्रिंट करें — या अगर आप यूटीएफ -16 के साथ काम कर रहे हैं, जिसके पास कई आंतरिक बातियां हैं, तो आपको ज़रूरत है विस्तृत वर्ण स्ट्रिंग प्रकारों में देखने के लिए

सी ++ 11 में यूनिकोड के लिए कुछ नया स्ट्रिंग प्रकार हैं

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

हालांकि, छोटे-यूटीएफ 8 नामक एक बहुत उपयोगी लाइब्रेरी लाइब्रेरी है, जो मूल रूप से std::string / std::wstring लिए ड्रॉप-इन प्रतिस्थापन है । यह अभी भी लापता utf8-string कंटेनर वर्ग के अंतराल को भरना है।

यह यूटीएफ 8 स्ट्रिंग्स के साथ 'डीलिंग' का सबसे सहज तरीका हो सकता है (युनिकोड सामान्यीकरण और समान सामान के बिना) आप आराम से कोडपॉइंट पर काम करते हैं, जबकि आपका स्ट्रिंग रन-लम्बी-एन्कोडेड char में एन्कोड करता रहता है।