C ++ स्ट्रिंग (या चार *) को wstring (या wchar_t *) में बदलें


171
string s = "おはよう";
wstring ws = FUNCTION(s, ws);

मैं w से s की सामग्री कैसे निर्दिष्ट करूँगा?

Google को खोजा और कुछ तकनीकों का उपयोग किया लेकिन वे सटीक सामग्री को निर्दिष्ट नहीं कर सकते। सामग्री विकृत है।


7
मुझे नहीं लगता कि strings8-बिट अक्षर स्वीकार करता है। क्या यह पहले से ही UTF-8 में कूटबद्ध है?
kennytm

3
आपका सिस्टम एन्कोडिंग क्या है कि यह "おはよう"एक सिस्टम-एन्कोडेड स्ट्रिंग बना देगा?
sbi

मुझे विश्वास है कि MSVC इसे स्वीकार करेगा और इसे कुछ मल्टीबैट एन्कोडिंग बना देगा, शायद UTF-8।
पोटैटोसवाटर

1
@Potatoswatter: MSVC किसी भी चीज़ के लिए डिफ़ॉल्ट रूप से UTF-8 का उपयोग नहीं करता है। आप उन अक्षरों को दर्ज करते हैं, यह जो करने के लिए फ़ाइल को रूपांतरित करने एन्कोडिंग पूछता है, और कोड पृष्ठ पर 1252. करने के लिए चूक
राँभना बतख

2
@ आमिर: अधिक महत्वपूर्ण यह है कि फाइल की एन्कोडिंग क्या है ? क्या आप उस स्ट्रिंग को फ़ाइल की शुरुआत में ले जा सकते हैं और उस हिस्से का एक हेक्सडंप दिखा सकते हैं? हम शायद उसी से इसकी पहचान कर सकते हैं।
मूंग बतख

जवाबों:


239

यह मानते हुए कि आपके उदाहरण में इनपुट स्ट्रिंग (は よ う is) एक UTF-8 एनकोडेड है (जो कि ऐसा नहीं है, इसके द्वारा दिखता है, लेकिन मान लें कि यह इस स्पष्टीकरण के लिए है :-)) एक यूनिकोड स्ट्रिंग का प्रतिनिधित्व आपकी रुचि के अनुसार, फिर आपकी समस्या को मानक पुस्तकालय (C ++ 11 और नए) के साथ पूरी तरह से हल किया जा सकता है।

TL; DR संस्करण:

#include <locale>
#include <codecvt>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(wide_utf16_source_string);
std::wstring wide = converter.from_bytes(narrow_utf8_source_string);

लंबे समय तक ऑनलाइन संकलन योग्य और चलने योग्य उदाहरण:

(वे सभी एक ही उदाहरण दिखाते हैं। अतिरेक के लिए बस कई हैं ...)

नोट (पुराना) :

जैसा कि टिप्पणियों में बताया गया है और https://stackoverflow.com/a/17106065/6345 में समझाया गया है कि यूटीएफ -8 और यूटीएफ -16 के बीच कनवर्ट करने के लिए मानक पुस्तकालय का उपयोग करते समय विभिन्न प्लेटफार्मों पर परिणामों में अप्रत्याशित अंतर हो सकता है। । बेहतर रूपांतरण के लिए, http://en.cppreference.com/w/cpp/locale/codecvt.utle8std::codecvt_utf8 पर वर्णित के रूप में विचार करें

नोट (नया) :

चूंकि codecvtहेडर C ++ 17 में पदावनत है, इसलिए इस उत्तर में प्रस्तुत समाधान के बारे में कुछ चिंताएं उठाई गईं। हालाँकि, C ++ मानक समिति ने http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0618r0.html कहा

इस पुस्तकालय घटक को एनेक्स डी के साथ सेवानिवृत्त किया जाना चाहिए, जब तक कि एक उपयुक्त प्रतिस्थापन को मानकीकृत नहीं किया जाता है।

तो भविष्य में, codecvtइस उत्तर में समाधान सुरक्षित और पोर्टेबल है।


2
जाँच करें कि आप किन फ़ाइलों को वी.एस. फाइलों में सहेजते हैं
जोहान गेर्ले

9
ज्ञात हो कि यह C ++ 11-केवल है!
bk138

1
MinGW (gcc / g ++ 4.8.1 और -std = c ++ 11) में कोडेकवार्ड हैडर मौजूद नहीं है। क्या कोई विकल्प है?
ब्रायन जैक

1
आप कृपया std::codecvt_utf8शुरुआती के लिए एक उदाहरण प्रदान करें
Noitidart

14
कृपया ध्यान दें कि <codecvt>C ++ 17 के बाद से हटा दिया गया है।
तमब्रे

47
int StringToWString(std::wstring &ws, const std::string &s)
{
    std::wstring wsTmp(s.begin(), s.end());

    ws = wsTmp;

    return 0;
}

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

28
यह उत्तर स्पष्ट रूप से अपर्याप्त है और कुछ भी नहीं है, लेकिन संकीर्ण वर्णों की नकल करें जैसा कि विस्तृत वर्णों में है। अन्य उत्तरों को देखें, विशेष रूप से जोहान गेर्ल द्वारा एक, बहु-बाइट या utf8 से सही तरीके से जाने के लिए कैसे स्ट्रिंग को utf16 wstring के लिए।
DLRdave

10
यह उत्तर खतरनाक है और संभवतः गैर-असिसी प्रणाली पर टूट जाएगा। यानी एक अरबी फ़ाइल नाम इस हैक से उलझ जाएगा।
स्टीफन

9
यह उत्तर उपयोगी है यदि आप प्रश्न के निकाय की बारीकियों को अनदेखा करते हैं और प्रश्न शीर्षक पर ध्यान केंद्रित करते हैं, जो मुझे Google से यहां लाया है। जैसा कि, सवाल का शीर्षक बेहद भ्रामक है और पूछे जाने वाले सच्चे प्रश्न को प्रतिबिंबित करने के लिए बदल दिया जाना चाहिए
ऐनी क्विन

3
यह केवल 7-बिट ASCII वर्णों के लिए काम करता है। लैटिन 1 के लिए, यह केवल तभी काम करता है जब चार को अहस्ताक्षरित के रूप में कॉन्फ़िगर किया गया हो। यदि प्रकार चार पर हस्ताक्षर किए गए हैं (जो कि ज्यादातर समय होता है), वर्ण> 127 गलत परिणाम देगा।

32

आपके प्रश्न को रेखांकित किया गया है। सख्ती से, वह उदाहरण एक वाक्यविन्यास त्रुटि है। हालाँकि, std::mbstowcsशायद वही है जिसकी आपको तलाश है।

यह एक सी-लाइब्रेरी फंक्शन है और बफ़र्स पर संचालित होता है, लेकिन यहाँ एक आसान-से-मुहावरे का प्रयोग है, जो कि TBohne (पूर्व में मूइंग डक) के सौजन्य से है:

std::wstring ws(s.size(), L' '); // Overestimate number of code points.
ws.resize(std::mbstowcs(&ws[0], s.c_str(), s.size())); // Shrink to fit.

1
स्ट्रिंग s = "s は よ ="; wchar_t * buf = new wchar_t [s.size ()]; size_t num_chars = mbstowcs (buf, s.c_str (), s.size ()); wstring ws (buf, num_chars); // ws = विकृत
Samir

1
@ आमिर: आपको यह सुनिश्चित करना होगा कि रन-टाइम एन्कोडिंग कम्पाइल-टाइम एन्कोडिंग के समान है। आपको setlocaleसंकलक झंडे को समायोजित या समायोजित करने की आवश्यकता हो सकती है । मुझे नहीं पता क्योंकि मैं विंडोज का उपयोग नहीं करता, लेकिन यही कारण है कि यह एक सामान्य विशेषता नहीं है। यदि संभव हो तो दूसरे उत्तर पर विचार करें।
पोटैटोसवाटर

1
std::string ws(s.size()); ws.resize(mbstowcs(&ws[0], s.c_str(), s.size());RAII FTW
मूसिंग डक

2
@WaffleSouffle यह पुराना है। 2011 के बाद से सम्‍मिलित कार्यान्वयन की आवश्‍यकता है और इस तरह की चालें बहुत पहले ही चली जाती हैं।
पोटाटोस्वाटर

1
और MinGW जैसे कुछ वातावरण अभी भी codecvt हैडर 'बेहतर' समाधान में से कुछ तो पहले अर्थ यह समस्या अभी भी MinGW में कोई अच्छा समाधान है भी दिसंबर 2014 के रूप में काम नहीं करते हैं की जरूरत नहीं है
ब्रायन जैक

18

Windows API केवल, पूर्व C ++ 11 कार्यान्वयन, यदि किसी को इसकी आवश्यकता हो तो:

#include <stdexcept>
#include <vector>
#include <windows.h>

using std::runtime_error;
using std::string;
using std::vector;
using std::wstring;

wstring utf8toUtf16(const string & str)
{
   if (str.empty())
      return wstring();

   size_t charsNeeded = ::MultiByteToWideChar(CP_UTF8, 0, 
      str.data(), (int)str.size(), NULL, 0);
   if (charsNeeded == 0)
      throw runtime_error("Failed converting UTF-8 string to UTF-16");

   vector<wchar_t> buffer(charsNeeded);
   int charsConverted = ::MultiByteToWideChar(CP_UTF8, 0, 
      str.data(), (int)str.size(), &buffer[0], buffer.size());
   if (charsConverted == 0)
      throw runtime_error("Failed converting UTF-8 string to UTF-16");

   return wstring(&buffer[0], charsConverted);
}

आप इसे ऑप्टिमाइज़ कर सकते हैं। का उपयोग करके स्ट्रिंग की दोहरी प्रतिलिपि करने की कोई आवश्यकता नहीं है vector। बस स्ट्रिंग में वर्णों को आरक्षित करें wstring strW(charsNeeded + 1);और फिर इसे रूपांतरण के लिए बफर के रूप में उपयोग करें &strW[0]:। अंत में सुनिश्चित करें कि अंतिम अशक्त करने के बाद रूपांतरण मौजूद हैstrW[charsNeeded] = 0;
c00000fd

1
@ c00000fd, जहाँ तक मुझे पता है, std :: basic_string आंतरिक बफर को केवल C 11 11 मानक के बाद से निरंतर होना आवश्यक है। मेरा कोड पूर्व C ++ 11 है, जैसा कि पोस्ट के शीर्ष पर दिया गया है। इसलिए, & strW [0] कोड मानक अनुरूप नहीं होगा और वैध रूप से रनटाइम पर दुर्घटनाग्रस्त हो सकता है।
एलेक्स चे।

13

यदि आप विंडोज / विजुअल स्टूडियो का उपयोग कर रहे हैं और आपको उपयोग करने के लिए स्ट्रिंग को परिवर्तित करने की आवश्यकता है:

#include <AtlBase.h>
#include <atlconv.h>
...
string s = "some string";
CA2W ca2w(s.c_str());
wstring w = ca2w;
printf("%s = %ls", s.c_str(), w.c_str());

एक wstring को स्ट्रिंग में बदलने के लिए एक ही प्रक्रिया (कभी-कभी आपको एक कोड पृष्ठ निर्दिष्ट करने की आवश्यकता होगी ):

#include <AtlBase.h>
#include <atlconv.h>
...
wstring w = L"some wstring";
CW2A cw2a(w.c_str());
string s = cw2a;
printf("%s = %ls", s.c_str(), w.c_str());

आप एक कोडपेज और यहां तक ​​कि UTF8 निर्दिष्ट कर सकते हैं ( जेएनआई / जावा के साथ काम करते समय यह बहुत अच्छा है )। इस उत्तर में एक std :: wstring को utf8 std :: string में बदलने का एक मानक तरीका दिखाया गया है

// 
// using ATL
CA2W ca2w(str, CP_UTF8);

// 
// or the standard way taken from the answer above
#include <codecvt>
#include <string>

// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}

// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.to_bytes(str);
}

यदि आप कोडपेज़ के बारे में अधिक जानना चाहते हैं तो सॉफ्टवेयर पर जोएल पर एक दिलचस्प लेख है: संपूर्ण न्यूनतम हर सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और चरित्र सेट के बारे में सकारात्मक रूप से जानना चाहिए

ये CA2W (कन्वर्ट एएनसी को वाइड = यूनिकोड) मैक्रोज़ एटीएल और एमएफसी स्ट्रिंग रूपांतरण मैक्रोज़ का हिस्सा हैं , जिनमें नमूने शामिल हैं।

कभी-कभी आपको सुरक्षा चेतावनी # 4995 'को अक्षम करने की आवश्यकता होगी, मुझे अन्य वर्कअराउंड की जानकारी नहीं है (मेरे लिए यह तब होता है जब मैं वीएस2012 में विंडोजएक्सपी के लिए संकलित करता हूं)।

#pragma warning(push)
#pragma warning(disable: 4995)
#include <AtlBase.h>
#include <atlconv.h>
#pragma warning(pop)

संपादित करें: खैर, इस लेख के अनुसार जोएल का लेख ऐसा प्रतीत होता है: "मनोरंजन करते समय, यह वास्तविक तकनीकी विवरण पर बहुत हल्का है"। आलेख: हर प्रोग्रामर को बिल्कुल, सकारात्मक और पाठ के साथ काम करने के लिए एन्कोडिंग और चरित्र सेट के बारे में जानने की आवश्यकता है


क्षमा करें, मैं एक देशी अंग्रेजी वक्ता नहीं हूं। जैसा कि आप फिट देखते हैं, कृपया संपादित करें।
lmiguelmh 14

डाउनवॉटर के साथ क्या है? उत्तर में क्या गलत है?
lmiguelmh

संभवतः यह तथ्य कि यह गैर-पोर्टेबल कोड को बढ़ावा देता है।
पावेल मिनाएव

हां, इसीलिए मैंने कहा कि यह केवल विंडोज / विजुअल स्टूडियो में काम करता है। लेकिन कम से कम यह समाधान सही है, और यह एक नहीं है:char* str = "hello worlddd"; wstring wstr (str, str+strlen(str));
lmiguelmh

अतिरिक्त नोट: CA2W ATL के नाम स्थान के तहत है। (ATL :: CA2W)
वैल

12

यहाँ संयोजन string, wstringऔर मिश्रित स्ट्रिंग स्थिरांक का एक तरीका है wstringwstringstreamकक्षा का उपयोग करें ।

यह मल्टी-बाइट कैरेक्टर एनकोडिंग के लिए काम नहीं करता है। यह केवल प्रकार की सुरक्षा को फेंकने और std से 7 बिट वर्णों का विस्तार करने का एक गूंगा तरीका है: std के प्रत्येक वर्ण के निचले 7 बिट्स में स्ट्रिंग: wstring। यह केवल तभी उपयोगी है जब आपके पास 7-बिट एएससीआईआई तार हो और आपको एक एपीआई कॉल करने की आवश्यकता हो जिसमें व्यापक तार की आवश्यकता हो।

#include <sstream>

std::string narrow = "narrow";
std::wstring wide = L"wide";

std::wstringstream cls;
cls << " abc " << narrow.c_str() << L" def " << wide.c_str();
std::wstring total= cls.str();

जवाब दिलचस्प लगता है। क्या आप कृपया थोड़ा समझा सकते हैं: क्या यह मल्टी-बाइट एन्कोडिंग के लिए काम करेगा, और क्यों / कैसे?
wh1t3cat1k

एन्कोडिंग योजनाएं भंडारण वर्ग के लिए रूढ़िवादी हैं। string1 बाइट वर्णों को wstringसंग्रहीत करता है और 2 बाइट वर्णों को संग्रहीत करता है। utf8 की तरह कुछ mulitbyte वर्णों को 1 बाइट मानों की एक श्रृंखला के रूप में संग्रहीत करता है, अर्थात string। स्ट्रिंग कक्षाएं एन्कोडिंग के साथ मदद नहीं करती हैं। मैं c ++ में क्लासेस एन्कोडिंग का विशेषज्ञ नहीं हूं।
मार्क लकाटा

2
किसी भी कारण से यह सबसे अच्छा जवाब नहीं है, यह देखते हुए कि यह कितना छोटा और सरल है? कोई भी मामला जो इसे कवर नहीं करता है?
रियू

@MarkLakata, मैंने आपका जवाब पहली टिप्पणी में पढ़ा लेकिन मुझे अभी भी यकीन नहीं है। क्या यह मल्टी-बाइट पात्रों के लिए काम करेगा? दूसरे शब्दों में, क्या यह उत्तर के रूप में एक ही नुकसान की संभावना नहीं है ?
मार्क.2377

@ Marc.2377 यह मल्टी-बाइट चरित्र एन्कोडिंग के लिए काम नहीं करता है। यह केवल प्रकार की सुरक्षा फेंकने और std::stringप्रत्येक चरित्र के निचले 7 बिट्स में से 7 बिट वर्णों को विस्तारित करने का एक गूंगा तरीका है std:wstring। यह केवल तभी उपयोगी है जब आपके पास 7-बिट एएससीआईआई तार हो और आपको एक एपीआई को कॉल करने की आवश्यकता हो जिसमें व्यापक तार की आवश्यकता हो। यदि आपको कुछ और परिष्कृत करने की आवश्यकता है, तो stackoverflow.com/a/8969776/3258851 को देखें ।
निशान लता

11

से char*करने के लिए wstring:

char* str = "hello worlddd";
wstring wstr (str, str+strlen(str));

से stringकरने के लिए wstring:

string str = "hello worlddd";
wstring wstr (str.begin(), str.end());

यह ध्यान दें कि यदि स्ट्रिंग में केवल ASCII वर्ण हैं, तो यह अच्छी तरह से काम करता है।


7
क्योंकि यह केवल काम करता है अगर एन्कोडिंग विंडोज -1252 है, जो प्रश्न में अक्षरों को भी पकड़ नहीं सकता है।
डक डक

3
ऐसा करने का कम से कम त्रुटि का तरीका है, जब आप जानते हैं कि आप ASCII से निपट रहे हैं। नए एपीआई में एप्स को पोर्ट करते समय यह एक प्रमुख प्रयोग है।
सरस्वती

यह तरीका नहीं है। यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं तो आपको उपयोग करना चाहिए atlconv.h। अन्य उत्तरों की जाँच करें।
lmiguelmh

7

Boost.Locale का उपयोग करना:

ws = boost::locale::conv::utf_to_utf<wchar_t>(s);

5

इसका यह रूप वास्तविक जीवन में मेरा पसंदीदा है। यह इनपुट को धर्मान्तरित करता है, यदि यह संबंधित के लिए UTF-8 मान्य है wstring। यदि इनपुट दूषित है, wstringतो सिंगल बाइट्स से निर्मित है। यदि आप वास्तव में अपने इनपुट डेटा की गुणवत्ता के बारे में सुनिश्चित नहीं हो सकते हैं तो यह बहुत उपयोगी है।

std::wstring convert(const std::string& input)
{
    try
    {
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
        return converter.from_bytes(input);
    }
    catch(std::range_error& e)
    {
        size_t length = input.length();
        std::wstring result;
        result.reserve(length);
        for(size_t i = 0; i < length; i++)
        {
            result.push_back(input[i] & 0xFF);
        }
        return result;
    }
}

1
मैंने अभी आपके उत्तर stackoverflow.com/questions/49669048/ पर आधारित इस प्रश्न को लॉन्च किया है। क्या आप कृपया एक नज़र
डाल

2

यदि आपके पास क्यूटी है और यदि आप एक फ़ंक्शन और सामान को लागू करने के लिए आलसी हैं, तो आप उपयोग कर सकते हैं

std :: string str; QString (एसटीआर) .toStdWString ()


लगभग, लेकिन आपको बस एक के साथ शुरू करना चाहिए QString, क्योंकि QStringनिर्माता किसी कारण से एक स्ट्रिंग को स्वीकार नहीं कर सकता है।
बोबस्बेनजामिन


यह अच्छा है। इसके अलावा, आप उपयोग कर सकते हैं .c_str () QString को कंस्ट्रक्टर में अपनी स्ट्रिंग को स्वीकार करने देने के लिए।
मिप जूल

1

विधि s2ws अच्छी तरह से काम करता है। आशा मदद करती है।

std::wstring s2ws(const std::string& s) {
    std::string curLocale = setlocale(LC_ALL, ""); 
    const char* _Source = s.c_str();
    size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    std::wstring result = _Dest;
    delete []_Dest;
    setlocale(LC_ALL, curLocale.c_str());
    return result;
}

6
इन सभी उत्तरों के साथ एक असुरक्षित तरीके से गतिशील मेमोरी को आवंटित करना और फिर बफर से स्ट्रिंग में डेटा की प्रतिलिपि बनाना है? असुरक्षित बिचौलिए से किसी को छुटकारा क्यों नहीं मिलता है?
डक डक

hahakubile, क्या आप ws2s के लिए कुछ इसी तरह की मदद कर सकते हैं?
समीक्षक

1

मेरे स्वयं के परीक्षण के आधार पर (विंडोज़ 8, बनाम2010 पर) mbstowcs वास्तव में मूल स्ट्रिंग को नुकसान पहुंचा सकता है, यह केवल ANSI पृष्ठ के साथ काम करता है। यदि MultiByteToWideChar / WideCharToMultiByte भी स्ट्रिंग भ्रष्टाचार का कारण बन सकता है - लेकिन वे उन पात्रों को बदलने के लिए जाते हैं जिन्हें वे 'नहीं जानते?' प्रश्न चिह्न, लेकिन mbstowcs बंद हो जाता है जब यह अज्ञात चरित्र का सामना करता है और उसी बिंदु पर स्ट्रिंग काटता है। (मैंने वियतनामी चरित्रों का परीक्षण विंडोज़ की खिड़कियों पर किया है)।

इसलिए एनालॉग एएनसी सी फंक्शंस पर मल्टी * विंडोज एप फंक्शन को प्राथमिकता दें।

इसके अलावा मैंने एक कोडपेज से दूसरे में स्ट्रिंग को एन्कोड करने के लिए सबसे छोटा तरीका क्या देखा है, मल्टीबीटीट्यूडवाइडर / वाइडक्रैटरटॉल्मबाइट एपि फंक्शन कॉल का उपयोग नहीं करता है, लेकिन उनके एनालॉग एटीएल मैक्रो: डब्ल्यूडब्ल्यूए / ए 2 डब्ल्यू।

इसलिए जैसा कि ऊपर बताया गया है, एनालॉग फ़ंक्शन ऐसा लगता है:

wstring utf8toUtf16(const string & str)
{
   USES_CONVERSION;
   _acp = CP_UTF8;
   return A2W( str.c_str() );
}

_acp USES_CONVERSION मैक्रो में घोषित किया गया है।

या वह कार्य जो मैं अक्सर याद करता हूं जब पुराने डेटा रूपांतरण को नया करने के लिए:

string ansi2utf8( const string& s )
{
   USES_CONVERSION;
   _acp = CP_ACP;
   wchar_t* pw = A2W( s.c_str() );

   _acp = CP_UTF8;
   return W2A( pw );
}

लेकिन कृपया ध्यान दें कि उन मैक्रो का भारी स्टैक का उपयोग करें - एक ही फ़ंक्शन के लिए लूप या पुनरावर्ती लूप का उपयोग न करें - डब्ल्यूए 2 ए या ए 2 डब्ल्यू मैक्रो का उपयोग करने के बाद - एएसएपी को वापस करने के लिए बेहतर है, इसलिए स्टैक को अस्थायी रूपांतरण से मुक्त किया जाएगा।


1

स्ट्रिंग wstring करने के लिए

std::wstring Str2Wstr(const std::string& str)
{
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

स्ट्रिंग के लिए wstring

std::string Wstr2Str(const std::wstring& wstr)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;
    return converterX.to_bytes(wstr);
}

1
इस Str2Wstr में 0 समाप्ति की समस्या है। "+" (Wstring s3 = s1 + s2 की तरह) के माध्यम से उत्पन्न तंतुओं को किसी भी समय समेटना संभव नहीं है। मैं जल्द ही इस समस्या को हल करने के लिए एक उत्तर पोस्ट करूंगा। मेमोरी लीक के लिए पहले कुछ परीक्षण करना होगा।
thewhiteambit

-2

string s = "おはよう"; एक त्रुटि है।

आपको सीधे wstring का उपयोग करना चाहिए:

wstring ws = L"おはよう";

1
वह भी काम करने वाला नहीं है। आपको उन गैर-बीएमपी वर्णों को सी एस्केप अनुक्रम में परिवर्तित करना होगा।
डेव वान डेन आईंडी

3
@Dave: यह काम करता है अगर आपका कंपाइलर स्रोत फ़ाइलों में यूनिकोड का समर्थन करता है, और पिछले एक दशक में सभी (दृश्य स्टूडियो, जीसीसी, ...)
थॉमस बोनिनी

नमस्ते, डिफ़ॉल्ट सिस्टम एन्कोडिंग की परवाह किए बिना (मैं उदाहरण के लिए मेरे डिफ़ॉल्ट सिस्टम एन्कोडिंग के रूप में अरबी हो सकता है), काम करने के लिए एल "お は work to" के लिए स्रोत कोड फ़ाइल की एन्कोडिंग क्या होनी चाहिए? क्या यह UTF-16 में होना चाहिए, या क्या मेरे पास UTF-8 बिना BOM के .cpp फ़ाइल एन्कोडिंग के लिए हो सकता है?
अफरीज़ा एन। एरीज़

2
@afriza: यह वास्तव में तब तक मायने नहीं रखता है जब तक आपका संकलन इसका समर्थन करता है
थॉमस बोनिनी

2
यह कोई त्रुटि नहीं है; "संकीर्ण" स्ट्रिंग में विस्तारित वर्णों को मल्टीबाइट अनुक्रमों के मानचित्र में परिभाषित किया गया है। कंपाइलर को इसका समर्थन तब तक करना चाहिए जब तक ओएस करता है, जो कम से कम आप पूछ सकते हैं।
पोटाटोज़वाटर

-2

अपने स्ट्रिंग को wstring में बदलने के लिए इस कोड का उपयोग करें

std::wstring string2wString(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;
}

int main(){
    std::wstring str="your string";
    std::wstring wStr=string2wString(str);
    return 0;
}

3
ध्यान दें कि प्रश्न में Windows का कोई उल्लेख नहीं है और यह उत्तर केवल Windows है।
जोहान गेर्ले

CP_ACPसबसे निश्चित रूप से गलत तर्क है। अचानक, निष्पादित थ्रेड के वातावरण की स्थिति कोड के व्यवहार पर प्रभाव डालती है। उचित नहीं। अपने रूपांतरण में एक निश्चित वर्ण एन्कोडिंग निर्दिष्ट करें। (और त्रुटियों को संभालने पर विचार करें।)
IInspectable
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.