2012-09-28 15 views
7
CString output ; 
const WCHAR* wc = L"Hellow World" ; 
if(wc != NULL) 
{ 
    output.Append(wc); 
} 
printf("output: %s\n",output.GetBuffer(0)); 
+0

कृपया शुद्ध कोड के रूप में एक स्पष्टीकरण जोड़ें, ज्यादा नहीं कहता है। – Kao

+0

आपको GetBuffer की आवश्यकता नहीं है। सीएसटींग में एक एलपीसीटीआर ऑपरेटर है जो आंतरिक बफर तक पहुंचता है। – MikMik

+1

यदि 'wc' 'привет мир' है तो आउटपुट क्या होना चाहिए? क्या आप कोड पृष्ठों के बारे में परवाह करते हैं या यह सिर्फ विस्तृत है -> सभी विस्तृत वर्णों के साथ संकीर्ण रूपांतरण एएनएसआई वर्ण हैं? –

उत्तर

12

तुम भी कोशिश कर सकते हैं इस:

#include <comdef.h> // you will need this 
const WCHAR* wc = L"Hello World" ; 
_bstr_t b(wc); 
const char* c = b; 
printf("Output: %s\n", c); 

_bstr_t औजार निम्नलिखित रूपांतरण ऑपरेटर, जो मुझे काफी आसान लगता है:

operator const wchar_t*() const throw(); 
operator wchar_t*() const throw(); 
operator const char*() const; 
operator char*() const; 

संपादित करें: उत्तर टिप्पणियों के संबंध में स्पष्टीकरण: लाइन const char* c = b; परिणाम _bstr_t उदाहरण द्वारा बनाई गई और प्रबंधित की गई स्ट्रिंग की एक संकीर्ण चरित्र प्रतिलिपि में परिणामस्वरूप इसे नष्ट होने पर इसे रिलीज़ कर देगा। ऑपरेटर सिर्फ इस प्रतिलिपि में एक सूचक देता है। इसलिए, इस स्ट्रिंग को कॉपी करने की कोई आवश्यकता नहीं है। इसके अलावा, प्रश्न में, CString::GetBufferLPTSTR (यानी TCHAR*) और LPCTSTR (यानी const TCHAR*) लौटाता है।

एक अन्य विकल्प रूपांतरण मैक्रो का उपयोग करने के लिए है:

USES_CONVERSION; 
const WCHAR* wc = L"Hello World" ; 
const char* c = W2A(wc); 

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

+0

मैं इसे +1 करने के लिए बहुत मोहक हूं। '_bstr_t' और' _variant_t' उन दिनों में मेरे सबसे अच्छे दोस्त थे जब आपको वास्तव में सी ++ – sehe

+0

में एक सभ्य COM घटक करने के लिए एटीएल की आवश्यकता होती थी, लेकिन यह सी – jack

+0

में डब्ल्यूसी की प्रतिलिपि नहीं बना रहा था, इसकी प्रतिलिपि क्यों होगी? आपका कोड दिखाता है कि आपको इसे 'printf' में उपयोग करने की आवश्यकता है। '_bstr_t' स्मृति को जारी करने का ख्याल रखेगा।यदि आपको प्रतिलिपि रखने और स्ट्रिंग को चारों ओर भेजने की आवश्यकता है, तो '_bstr_t' उदाहरण का उपयोग करें, न कि' const char * '- इस अर्थ में, '_bstr_t'' CString' के समान है। जब ऑब्जेक्ट की कई प्रतियों का उपयोग किया जाता है तो यह स्ट्रिंग डेटा को ठीक से कॉपी करने का ख्याल रखता है (हालांकि यह * कॉपी-ऑन-राइट * का उपयोग नहीं करता है)। –

1

आप ऐसा कर सकता है, या आप क्लीनर कुछ कर सकते हैं:

std::wcout << L"output: " << output.GetString() << std::endl; 
+1

'GetBuffer()' का उपयोग क्यों करें? यहां 'GetString() 'आधिकारिक सी-स्ट्रिंग गेटर है! – Rost

+0

@ रोस्ट कॉपी-पेस्ट: डी को चिल्लाना जरूरी नहीं है: डी –

+2

कॉपी-पेस्ट बुरा है !!! असली डेवलपर्स हमेशा चार द्वारा चार टाइप करें! नहीं बूझते हो?!? :- डी – Rost

1

यह काफी आसान है क्योंकि CString सिर्फ CStringT के लिए एक typedef है, और आप भी CStringA और CStringW की पहुंच है (आप मतभेदों के बारे में दस्तावेज़ पढ़ चाहिए)।

CStringW myString = L"Hello World"; 
CString myConvertedString = myString; 
+0

'CStringA myConvertedString (एल" हैलो वर्ल्ड "); ' – Rost

+0

भी काम करता है, हाँ, मुझे एहसास है, लेकिन यह उनके उदाहरण कोड के करीब होने का तरीका लिखा गया था। –

+0

यह रूपांतरण व्यापक वर्णों के साथ क्या करता है जिसमें मेल खाने वाले संकीर्ण चार नहीं होते हैं? –

5

आप इस उद्देश्य के लिए sprintf उपयोग कर सकते हैं:

const char output[256]; 
const WCHAR* wc = L"Hellow World" ; 
sprintf(output, "%ws", wc); 
+0

मुझे नहीं लगता कि आप 'आउटपुट' को 'const' के रूप में घोषित कर सकते हैं – CinCout

2

लिनक्स

// Debian GNU/Linux 8 "Jessie" (amd64) 

#include <locale.h> 
#include <stdlib.h> 
#include <stdio.h> 

// Use wcstombs(3) to convert Unicode-string (wchar_t *) to UTF-8 (char *) 
// http://man7.org/linux/man-pages/man3/wcstombs.3.html 

int f(const wchar_t *wcs) { 
     setlocale(LC_ALL,"ru_RU.UTF-8"); 
     printf("Sizeof wchar_t: %d\n", sizeof(wchar_t)); 
     // on Windows, UTF-16 is internal Unicode encoding (UCS2 before WinXP) 
     // on Linux, UCS4 is internal Unicode encoding 
     for (int i = 0; wcs[i] > 0; i++) printf("%2d %08X\n",i,wcs[i]); 
     char s[256]; 
     size_t len = wcstombs(s,wcs,sizeof(s)); 
     if (len > 0) { 
       s[len] = '\0'; 
       printf("mbs: %s\n",s); 
       for (int i = 0; i < len; i++) 
         printf("%2d %02X\n",i,(unsigned char)s[i]); 
       printf("Size of mbs, in bytes: %d\n",len); 
       return 0; 
     } 
     else return -1; 
} 

int main() { 
     f(L"Привет"); // 6 symbols 
     return 0; 
} 

के लिए मेरे कोड कैसे निर्माण करने के लिए

#!/bin/sh 
NAME=`basename $0 .sh` 
CC=/usr/bin/g++-4.9 
INCS="-I." 
LIBS="-L." 
$CC ${NAME}.c -o _${NAME} $INCS $LIBS 

आउटपुट

$ ./_test 
Sizeof wchar_t: 4 
0 0000041F 
1 00000440 
2 00000438 
3 00000432 
4 00000435 
5 00000442 
mbs: Привет 
0 D0 
1 9F 
2 D1 
3 80 
4 D0 
5 B8 
6 D0 
7 B2 
8 D0 
9 B5 
10 D1 
11 82 
Size of mbs, in bytes: 12 
संबंधित मुद्दे