2011-06-09 21 views
21

मैं TCHAR सरणी को std::string (std::basic_string पर नहीं) कैसे परिवर्तित करूं?एक TCHAR सरणी को std :: string में कैसे परिवर्तित करें?

+11

आपको पता std :: स्ट्रिंग सिर्फ एक एसटीडी के लिए एक typedef है :: basic_string ? –

+0

और क्या आप एक विशेष रूप से यूनिकोड या एमबीसीएस टीसीएचएआर (यानी वास्तव में WCHAR या CHAR) को एक std :: string (i.e. char) में परिवर्तित करना चाहते हैं, या CHAR को स्ट्रिंग और WCHAR को wstring में परिवर्तित करना चाहते हैं, या कुछ और? – Rup

उत्तर

29

TCHAR सिर्फ एक टाइपिफ़ है कि, आपके संकलन विन्यास के आधार पर, या तो char या wchar पर डिफ़ॉल्ट है।

मानक टेम्पलेट लाइब्रेरी ASCII (std::string के साथ) और विस्तृत वर्ण सेट (std::wstring के साथ) दोनों का समर्थन करता है। आपको बस इतना करना है कि टाइपपीफ स्ट्रिंग :: स्ट्रिंग :: स्ट्रिंग :: std :: wstring के रूप में स्ट्रिंग आपके संकलन कॉन्फ़िगरेशन के आधार पर है। लचीलापन बनाए रखने के लिए आप निम्नलिखित कोड का उपयोग कर सकते हैं:

#ifndef UNICODE 
    typedef std::string String; 
#else 
    typedef std::wstring String; 
#endif 

अब आप अपने कोड में String उपयोग कर सकते हैं और संकलक बुरा भागों संभालने दें। स्ट्रिंग में अब रचनाकार होंगे जो आपको TCHAR से std::string या std::wstring रूपांतरित करने देता है।

+3

समस्या यह है कि मुझे एक इंटरफ़ेस कॉल करना है जो std :: स्ट्रिंग स्वीकार करता है, इसलिए मैं std :: wstring भेज नहीं सकता :( – ashmish2

+0

देखें [यह प्रश्न] (http://stackoverflow.com/questions/4804298/c-how-to- wstring-string-string/4804506 # 4804506) wstring से स्ट्रिंग में कनवर्ट करने के लिए कैसे करें। – kbjorklu

+0

यूनिकोड वातावरण में 'cout' के साथ 'स्ट्रिंग' कैसे काम करता है? –

5

आपकी परियोजना सेटिंग्स के आधार पर, TCHAR प्रकार char या wchar_t है।

#ifdef UNICODE 
    // TCHAR type is wchar_t 
#else 
    // TCHAR type is char 
#endif 

तो अगर आप std::wstring के बजाय std::string का उपयोग करना चाहिए, तो आप एक कनवर्टर समारोह का उपयोग करना चाहिए। मैं wcstombs या WideCharToMultiByte का उपयोग कर सकता हूं।

TCHAR * text; 

#ifdef UNICODE 
    /*/ 
    // Simple C 
    const size_t size = (wcslen(text) + 1) * sizeof(wchar_t); 
    wcstombs(&buffer[0], text, size); 
    std::vector<char> buffer(size); 
    /*/ 
    // Windows API (I would use this) 
    std::vector<char> buffer; 
    int size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL); 
    if (size > 0) { 
     buffer.resize(size); 
     WideCharToMultiByte(CP_UTF8, 0, text, -1, static_cast<BYTE*>(&buffer[0]), buffer.size(), NULL, NULL); 
    } 
    else { 
     // Error handling 
    } 
    //*/ 
    std::string string(&buffer[0]); 
#else 
    std::string string(text); 
#endif 
+0

मैंने इसे आजमाया, मिला: त्रुटि C2664: 'std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: basic_string <_Elem, _Traits, _Ax> &)': 'TCHAR से पैरामीटर 1 को परिवर्तित नहीं कर सकता [ 50] 'to' const std :: basic_string <_Elem, _Traits, _Ax> और ' –

+1

@ user396483: मैंने बस इसे VS2012 में आजमाया। कोड: [लिंक] (http://store.naszta.hu/main/example01.cpp)। – Naszta

3

TCHAR, या तो चार या wchar_t है तो एक

typedef basic_string<TCHAR> tstring; 

यह ऐसा करने का एक तरीका है।

दूसरा char पूरी तरह से छोड़ना है और बस std::wstring का उपयोग करना है।

2

मेरा उत्तर देर हो गया है, मैं इसे स्वीकार करूंगा, लेकिन 'आलोक सेव' के जवाब और कुछ शोधों के साथ मुझे एक अच्छा तरीका मिला है! (नोट: मैं इस संस्करण एक बहुत का परीक्षण नहीं किया है, तो यह हर मामले में काम नहीं कर सकते, लेकिन से मैं क्या परीक्षण किया यह होना चाहिए):

TCHAR t = SomeFunctionReturningTCHAR(); 
std::string str; 

#ifndef UNICODE 
    str = t; 
#else 
    std::wstring wStr = t; 
    str = std::string(wStr.begin(), wStr.end()); 
#endif 

std::cout << str << std::endl; //<-- should work! 
+0

यह केवल 7-बिट ASCII के लिए काम करता है, लेकिन अन्य पात्रों के लिए कचरा प्रिंट करता है। – palota

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