मैं C++ एक JSON पार्सर लिख रहा हूँ और जब JSON तार पार्स करने में कोई समस्या का सामना करना पड़ रहा हूँ:JSON तारों में यूनिकोड मानों को कैसे प्रबंधित करें?
JSON विनिर्देश कहा गया है कि JSON तार के रूप में यूनिकोड वर्ण हो सकते हैं:
"here comes a unicode character: \u05d9 !"
मेरे JSON पार्सर JSON तारों को std::string
पर मैप करने का प्रयास करता है, इसलिए आम तौर पर, JSON तारों का एक वर्ण std::string
का एक चरित्र बन जाता है। हालांकि उन यूनिकोड वर्ण के लिए, मैं वास्तव में क्या करना है पता नहीं:
मैं सिर्फ इतना की तरह मेरे std::string
में कच्चे बाइट्स मान रखना चाहिए:
std::string mystr;
mystr.push_back('\0x05');
mystr.push_back('\0xd9');
या मैं एक साथ दो पात्रों की व्याख्या करना चाहिए लाइब्रेरी iconv
और इसके बजाय मेरी स्ट्रिंग में यूटीएफ -8 एन्कोडेड परिणाम स्टोर करें?
क्या मुझे सभी पात्रों को स्टोर करने के लिए std::wstring
का उपयोग करना चाहिए? फिर * NIX OSes पर जहां wchar_t
4-बाइट लंबा है?
मुझे लगता है कि मेरे समाधान में कुछ गलत है लेकिन मैं समझने में असफल रहा। मुझे उस स्थिति में क्या करना चाहिए?
यदि wchar_t 4 बाइट लंबा है, तो आप केवल शून्य-विस्तार कर सकते हैं ... इसके अलावा, यूटीएफ -8 का मतलब 8-बिट वर्ण नहीं है। गैर-ASCII यूटीएफ -8 एन्कोडिंग में भी कई बाइट्स का उपयोग करके संग्रहीत किया जाएगा। –
@ एच 2CO3: निश्चित रूप से, वास्तव में। http://json.org कहता है कि एक * स्ट्रिंग * में ** कोई यूनिकोड चरित्र हो सकता है ** लेकिन यह नहीं कहता कि वे तार यूटीएफ -8 या यूटीएफ -16 एनकोडेड हैं या नहीं। ऐसा लगता है कि यह यूटीएफ -8 अक्षरों के लिए एक विशेष प्रतिनिधित्व के साथ यूटीएफ -8 एन्कोडिंग है। मेरे प्रश्न का एक लक्ष्य यह सुनिश्चित करने के लिए भी है। – ereOn
"यूटीएफ -16 अक्षरों" जैसी कोई चीज़ नहीं है। यूनिकोड वर्ण हैं जो एएससीआईआई का हिस्सा नहीं हैं, और वे यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 में कई बाइट्स का उपयोग करके एन्कोड किए गए हैं। यूटीएफ -16 और यूटीएफ -32 में मिश्रित-से-बहु-बाइट-वाइड-कैरेक्टर स्ट्रिंग्स सभी पात्रों को समान लंबाई के क्रम में jsut सुविधा हैं। –