कैसे सी + + (यूनिकोड) में LPCWSTR के लिए std :: string कन्वर्ट करने के लिए


115

मैं एक विधि की तलाश कर रहा हूं, या LPCWSTR के लिए std :: string को परिवर्तित करने के लिए एक कोड स्निपेट


1
हम उल्टा कैसे करते हैं?
सोहाइब

मैं इसके विपरीत करने की कोशिश कर रहा था। क्या आपको कोई विधि नहीं मिली?
टॉम ज़ातो -

जवाबों:


134

MSDN लेख के लिंक के लिए धन्यवाद। यही वह है जिसकी तलाश में मैं हूं।

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();

4
(इस सवाल को बेतरतीब ढंग से ब्राउज़ करते हुए पाया? जब से मैंने C ++ किया है, यह एक लंबा समय है।) इसलिए मानक पुस्तकालय में std :: string -> std :: wstring रूपांतरण नहीं है? यह अजीब लगता है; क्या कोई अच्छा कारण है?
डोमिनिक

5
यदि आप buf के लिए स्टोरेज बनाने के लिए std :: वेक्टर <wchar_t> का उपयोग करते हैं, तो यदि कुछ भी अपवाद फेंकता है तो आपका अस्थायी बफर मुक्त हो जाएगा।
जेसन हैरिसन

81
कारण # 233 के रूप में क्यों सी + + नरक से मुझे बाहर निकालता है..एक सरल स्ट्रिंग रूपांतरण के लिए कोड की 10 लाइनें = /
b1nary.atr0phy

2
या यूँ कहें wstring ws (s.begin (), s.end ()) ...?
CJBrew

3
@CJBrew: हर समस्या के लिए एक समाधान है, वह है स्वच्छ, सुरुचिपूर्ण और गलत। आपका यह अनुमान इस पर आधारित है कि आपका इनपुट ASCII ( एएनएसआई नहीं ) अक्षर ही रखता है ।
IInspectable

121

समाधान वास्तव में किसी भी अन्य सुझावों की तुलना में बहुत आसान है:

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

सभी के सर्वश्रेष्ठ, यह स्वतंत्र मंच है। h2h :)


2
क्षमा करें, लेकिन यह मेरे लिए काम नहीं करता है, तो Toran का अपना समाधान ठीक काम करता प्रतीत होता है (लेकिन..बल!)।
कॉलिन्स

32
यह केवल तभी काम करता है जब सभी अक्षर सिंगल बाइट यानी ASCII या ISO-8859-1 हों । मल्टी-बाइट कुछ भी बुरी तरह विफल हो जाएगा, जिसमें यूटीएफ -8 भी शामिल है।
मार्क रैनसम

मेरा मानना ​​है कि आप पहली पंक्ति को सरल बना सकते हैं: std :: wstring stemp (s.begin (), s.end ()); यह एक संभावित प्रतिलिपि को समाप्त करेगा और सरल दिखाई देगा; ध्यान दें कि कंपाइलर किसी भी तरह कॉपी को खत्म कर सकता है , लेकिन यह अभी भी एक सरल लुक है।
१०

13
भगवान, सभी उत्थान के साथ क्या है? यह जवाब कभी-कभी , केवल संयोग से काम करता है । यह पूरी तरह से चरित्र एन्कोडिंग की उपेक्षा करता है । आप बस एक संकीर्ण चरित्र को चौड़ा नहीं कर सकते, और इसके लिए एक ही कोड बिंदु का प्रतिनिधित्व करते हुए जादुई रूप से एक विस्तृत चरित्र में बदल सकते हैं। यह नैतिक के बराबर है reinterpret_castयह कोड काम नहीं करता है। प्रयोग नहीं करें।
IInspectable

2
@ माइक: विंडोज पर, एक charआमतौर पर ANSI के रूप में एन्कोड किया गया है। एएनएसआई एन्कोडिंग के साथ, 255 के माध्यम से 128 के मानों की व्याख्या वर्तमान में सक्रिय कोड पेज का उपयोग करके की जाती है। उन मूल्यों को एक wchar_t(विंडोज़ पर UTF-16 एन्कोडिंग) में दिखाने से वांछित परिणाम नहीं होगा। यदि आप सटीक होना चाहते हैं, तो यह ठीक 50% मामलों में काम करता है। DBCS वर्ण एन्कोडिंग को ध्यान में रखते हुए, वह प्रतिशत और घट जाता है।
IInspectable

9

यदि आप ATL / MFC वातावरण में हैं, तो आप ATL रूपांतरण मैक्रो का उपयोग कर सकते हैं:

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

फिर आप LPCWSTR के रूप में unicodeStr का उपयोग कर सकते हैं। यूनिकोड स्ट्रिंग के लिए मेमोरी को स्टैक पर बनाया जाता है और फिर यूनिकोडस्ट्र के लिए विध्वंसक जारी किया जाता है।


-1

एक std :: string का उपयोग करने के बजाय, आप एक std :: wstring का उपयोग कर सकते हैं।

संपादित करें: क्षमा करें यह अधिक व्याख्यात्मक नहीं है, लेकिन मुझे दौड़ना होगा।

Std :: wstring :: c_str () का उपयोग करें


9
प्रश्न: "मुझे X से Y में बदलने की आवश्यकता है" - ए: "एक नौकरी की तलाश करें, जहां वे एक्स के बजाय ए का उपयोग कर रहे हैं।" यह बेकार है।
IInspectable

सभी पेड़ों के लिए जंगल नहीं देख सकते? यह उपयोगी है, क्योंकि यह वही है जो मैं देख रहा था
चार्ली

-3
string  myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
 std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();

-3

LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.begin ())। C_str ()


2
यह समाधान पहले से ही 9 साल पहले प्रस्तावित किया गया था जिसमें से एक शीर्ष उत्तर
नीनो फीलू

1
और यह 9 साल पहले गलत था, जितना आज गलत है। टिप्पणियां बताती हैं, यह केवल कोड इकाइयों की एक संकीर्ण श्रेणी के लिए क्यों काम करता है।
IInspectable
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.