2009-12-01 10 views
8

मेरे पास एक संस्करण बीएसटी है जिसे एमएसएक्सएमएल डोम से खींचा गया था, इसलिए यह यूटीएफ -16 में है। मैं क्या डिफ़ॉल्ट एन्कोडिंग इस रूपांतरण के साथ होता है यह पता लगाने की कोशिश कर रहा हूँ:vdt bstr के लिए डिफ़ॉल्ट एन्कोडिंग std :: स्ट्रिंग रूपांतरण

VARIANT vtNodeValue; 
pNode->get_nodeValue(&vtNodeValue); 
string strValue = (char*)_bstr_t(vtNodeValue); 

परीक्षण से, मुझे विश्वास है कि डिफ़ॉल्ट एन्कोडिंग या तो विंडोज़ -1252 या ASCII है, लेकिन यकीन है कि नहीं हूँ।

बीटीडब्ल्यू, यह कोड का हिस्सा है कि मैं संस्करण को फिक्स कर रहा हूं और वेरिएंट को एक wstring में परिवर्तित कर रहा हूं और एक वाइड-बाइट एन्कोडिंग में जा रहा हूं जिसमें वाइडरहर्टोमल्टी बाइट को कॉल किया गया है।

धन्यवाद!

उत्तर

10

operator char* विधि _com_util::ConvertBSTRToString() पर कॉल करता है। The documentation बहुत ही अनुपयोगी है, लेकिन मुझे लगता है कि यह रूपांतरण करने के लिए वर्तमान लोकेल सेटिंग्स का उपयोग करता है।

अद्यतन:

आंतरिक रूप से, _com_util::ConvertBSTRToString() कॉल WideCharToMultiByte, सभी कोड-पेज और डिफ़ॉल्ट चरित्र पैरामीटर के लिए शून्य से गुजर रहा। यह CP_ACP पास करने जैसा ही है, जिसका अर्थ सिस्टम की वर्तमान एएनएसआई कोड-पेज सेटिंग (वर्तमान थ्रेड सेटिंग नहीं) का उपयोग करना है।

यदि आप डेटा खोने से बचना चाहते हैं, तो आपको शायद WideCharToMultiByte पर कॉल करना चाहिए और CP_UTF8 का उपयोग करना चाहिए। आप अभी भी स्ट्रिंग को नल-टर्मिनेटेड सिंगल-बाइट स्ट्रिंग के रूप में देख सकते हैं और std::string का उपयोग कर सकते हैं, आप बाइट्स को वर्णों के रूप में नहीं देख सकते हैं।

+2

धन्यवाद !!! यूएस विंडोज़ पर डिफ़ॉल्ट कोड पेज 1252 है, जो मैंने देखा है उसके अनुरूप है। यह इस कॉल के साथ किसी भी मशीन पर निर्धारित किया जा सकता है: \t int nCodePage = GetACP(); –

0

std::string स्वयं ही कोई एन्कोडिंग निर्दिष्ट/निर्दिष्ट नहीं करता है। यह केवल बाइट्स का अनुक्रम है। std::wstring के लिए यह वही है, जो केवल wchar_t एस (डबल-बाइट शब्द, Win32 पर) का अनुक्रम है।

_bstr_t को char* में operator char* के माध्यम से परिवर्तित करके, आपको केवल कच्चे डेटा के लिए सूचक मिलेगा। According to MSDN, इस डेटा में व्यापक वर्ण हैं, यानी, wchar_t s, जो यूटीएफ -16 का प्रतिनिधित्व करता है।

मुझे आश्चर्य है कि यह वास्तव में std::string बनाने के लिए काम करता है; आपको पहले शून्य बाइट से पहले नहीं मिलना चाहिए (जो जल्द ही होता है, यदि आपकी मूल स्ट्रिंग अंग्रेजी है)।

लेकिन चूंकि wstringwchar_t के एक स्ट्रिंग है, तो आप इस प्रकार, _bstr_t से सीधे एक निर्माण करने के लिए सक्षम होना चाहिए:

_bstr_t tmp(vtNodeValue); 
wstring strValue((wchar_t*)tmp, tmp.length()); 

(मैं length के बारे में निश्चित नहीं हूँ, यह बाइट की संख्या है या वर्णों की संख्या?) फिर, आपके पास wstring होगा जो यूटीएफ -16 में एन्कोड किया गया है जिस पर आप WideCharToMultiByte पर कॉल कर सकते हैं।

+0

यह सही नहीं है, यह वास्तव में एक कलाकार नहीं है, 'bstr_t' में' ऑपरेटर char * 'परिभाषित किया गया है जो आंतरिक रूप से रूपांतरण करता है। –

+0

मुझे पता है। क्या शब्द "कास्ट" अनुचित है? शायद "रूपांतरण ऑपरेटर" बेहतर है। मैं इसे बदल दूंगा। – Thomas

+0

यह गलत है: '_bstr_t' को 'char *' में कास्टिंग करना '_com_util :: ConvertBSTRToString' फ़ंक्शन को स्ट्रिंग को बाइट-आधारित एन्कोडिंग में परिवर्तित करने के लिए कॉल करता है। – interjay

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