2009-06-18 14 views
29

मैं जानकारी खोने के बिना एक सी ++ std::string यूटीएफ -8 या std::wstring में परिवर्तित करने की कोशिश कर रहा हूं (एक स्ट्रिंग पर विचार करें जिसमें गैर-ASCII वर्ण हैं)।क्या एन्कोडिंग std :: string.c_str() का उपयोग करता है?

http://forums.sun.com/thread.jspa?threadID=486770&forumID=31 के अनुसार:

std :: स्ट्रिंग गैर- ASCII वर्ण है, तो आप एक समारोह है कि आपके एन्कोडिंग से UTF-8 में धर्मान्तरित प्रदान करनी चाहिए [...]

क्या एन्कोडिंग std::string.c_str() उपयोग करता है? मैं इसे क्रॉस-प्लेटफ़ॉर्म फैशन में यूटीएफ -8 या std::wstring में कैसे परिवर्तित कर सकता हूं?

उत्तर

35

std::string प्रति से कोई एन्कोडिंग का उपयोग नहीं करता है - यह आपके द्वारा डाले गए बाइट्स को वापस कर देगा। उदाहरण के लिए, वे बाइट्स आईएसओ -885 9 -1 एन्कोडिंग ... या किसी अन्य का उपयोग कर सकते हैं, वास्तव में: एन्कोडिंग के बारे में जानकारी सिर्फ वहां नहीं है - आपको पता होना चाहिए कि बाइट कहां से आ रहे थे!

+0

तो अनिवार्य रूप से मेरे पास समय से पहले एन्कोडिंग को जानने के बिना std :: string को परिवर्तित करने का कोई तरीका नहीं है? मैं पूछता हूं क्योंकि मैं एक एपीआई फ़ंक्शन लिख रहा हूं जो std :: स्ट्रिंग में लेता है। मुझे लगता है कि दस्तावेज को उपयोगकर्ताओं को यह निर्देश देने की आवश्यकता होगी कि किस प्रारूप में पास होना है। – Gili

+3

@Gili, दाएं: आप यूटीएफ -8 (या कुछ और ;-)) के अज्ञात एन्कोडिंग में बाइट अनुक्रम को विश्वसनीय रूप से परिवर्तित नहीं कर सकते हैं। मैं आपको कॉलर से यूटीएफ -8 डेटा की आपूर्ति करने के लिए कहता हूं - अधिकांश अन्य एन्कोडिंग एन्कोडिंग _every_ संभव यूनिकोड स्ट्रिंग को अनुमति नहीं देते हैं। जैसा कि @ नाफ कहते हैं, एएससीआईआई यूटीएफ -8 (और आईएसओ -885 9- * और कई अन्य एन्कोडिंग) का एक विशेष मामला है, इसलिए यदि आपका मामला कोई चिंता नहीं है (इस तथ्य के उपयोगकर्ताओं को याद दिलाने वाले दस्तावेज़ों में एक फुटनोट _them_ बचा सकता है चिंता ;-)। –

+0

अच्छा जवाब, धन्यवाद :) – Gili

7

std::string बाइट्स का कोई अनुक्रम है, इसलिए एन्कोडिंग आपके ऊपर है। आपको पता होना चाहिए कि यह कैसे एन्कोड किया गया है। हालांकि, अगर आपको नहीं पता कि यह कुछ और है, तो शायद यह सिर्फ ASCII है। इस मामले में, यह पहले से ही यूटीएफ -8 संगत है।

+12

मैंने देखा है "यह शायद ... "इतनी सारी वर्ण एन्कोडिंग त्रुटियों का स्रोत बनें। मैं चरित्र एन्कोडिंग की बात करते समय कभी अनुमान लगाता हूं: आप जो भी लेते हैं और जो भी आप उत्पादन करते हैं, उसमें हमेशा स्पष्ट रहें। प्रत्येक मामले में, यदि आप चरित्र सेट को spec नहीं करते हैं, तो एन्कोडिंग को इंगित करने के लिए एक अतिरिक्त पैरामीटर/वापसी मान spec। – MtnViewMark

संबंधित मुद्दे