CString output ;
const WCHAR* wc = L"Hellow World" ;
if(wc != NULL)
{
output.Append(wc);
}
printf("output: %s\n",output.GetBuffer(0));
उत्तर
तुम भी कोशिश कर सकते हैं इस:
#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::GetBuffer
LPTSTR
(यानी TCHAR*
) और LPCTSTR
(यानी const TCHAR*
) लौटाता है।
एक अन्य विकल्प रूपांतरण मैक्रो का उपयोग करने के लिए है:
USES_CONVERSION;
const WCHAR* wc = L"Hello World" ;
const char* c = W2A(wc);
इस दृष्टिकोण के साथ समस्या यह है कि परिवर्तित स्ट्रिंग के लिए स्मृति ढेर पर आवंटित किया जाता है है, इसलिए स्ट्रिंग की लंबाई सीमित है। हालांकि, रूपांतरण मैक्रोज़ का यह परिवार आपको कोड पेज का चयन करने की अनुमति देता है जिसका उपयोग रूपांतरण के लिए किया जाना है, जिसे अक्सर स्ट्रिंग में गैर-एएनएसआई वर्णों की आवश्यकता होती है।
मैं इसे +1 करने के लिए बहुत मोहक हूं। '_bstr_t' और' _variant_t' उन दिनों में मेरे सबसे अच्छे दोस्त थे जब आपको वास्तव में सी ++ – sehe
में एक सभ्य COM घटक करने के लिए एटीएल की आवश्यकता होती थी, लेकिन यह सी – jack
में डब्ल्यूसी की प्रतिलिपि नहीं बना रहा था, इसकी प्रतिलिपि क्यों होगी? आपका कोड दिखाता है कि आपको इसे 'printf' में उपयोग करने की आवश्यकता है। '_bstr_t' स्मृति को जारी करने का ख्याल रखेगा।यदि आपको प्रतिलिपि रखने और स्ट्रिंग को चारों ओर भेजने की आवश्यकता है, तो '_bstr_t' उदाहरण का उपयोग करें, न कि' const char * '- इस अर्थ में, '_bstr_t'' CString' के समान है। जब ऑब्जेक्ट की कई प्रतियों का उपयोग किया जाता है तो यह स्ट्रिंग डेटा को ठीक से कॉपी करने का ख्याल रखता है (हालांकि यह * कॉपी-ऑन-राइट * का उपयोग नहीं करता है)। –
आप ऐसा कर सकता है, या आप क्लीनर कुछ कर सकते हैं:
std::wcout << L"output: " << output.GetString() << std::endl;
यह काफी आसान है क्योंकि CString
सिर्फ CStringT
के लिए एक typedef है, और आप भी CStringA
और CStringW
की पहुंच है (आप मतभेदों के बारे में दस्तावेज़ पढ़ चाहिए)।
CStringW myString = L"Hello World";
CString myConvertedString = myString;
'CStringA myConvertedString (एल" हैलो वर्ल्ड "); ' – Rost
भी काम करता है, हाँ, मुझे एहसास है, लेकिन यह उनके उदाहरण कोड के करीब होने का तरीका लिखा गया था। –
यह रूपांतरण व्यापक वर्णों के साथ क्या करता है जिसमें मेल खाने वाले संकीर्ण चार नहीं होते हैं? –
आप इस उद्देश्य के लिए sprintf
उपयोग कर सकते हैं:
const char output[256];
const WCHAR* wc = L"Hellow World" ;
sprintf(output, "%ws", wc);
मुझे नहीं लगता कि आप 'आउटपुट' को 'const' के रूप में घोषित कर सकते हैं – CinCout
लिनक्स
// 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
- 1. कैसे स्थिरांक चार को wchar_t * कन्वर्ट करने के लिए *
- 2. स्थिरांक चार myVar * बनाम स्थिरांक चार myVar []
- 3. सी ++, करने के लिए 'स्थिरांक चार *'
- 4. स्थिरांक चार की एक स्थिर स्थिरांक सरणी *
- 5. सी ++: स्थिरांक चार * स्थिरांक * का अर्थ
- 6. स्थिर चार स्थिरांक को प्रारंभ * somevar
- 7. निर्वासन स्थिरांक चार * स्थिरांक SOME_CONSTANT मुझे दे लिंकर त्रुटियों
- 8. यह उचित एक "स्थिरांक चार *" हेडर फाइल
- 9. स्थिरांक वस्तु और स्थिरांक निर्माता
- 10. स्थिरांक और STL कंटेनरों में गैर स्थिरांक
- 11. कास्टिंग ऑपरेटर स्थिरांक बनाम गैर-स्थिरांक
- 12. PHP स्थिरांक कैसे बदलें?
- 13. php स्थिरांक
- 14. जावा आइकन स्थिरांक - स्थिर स्थिरांक ठीक हैं?
- 15. स्थिरांक सूचक एक सूचक
- 16. मॉड्यूल के स्थिरांक और चर शामिल करने के लिए कैसे?
- 17. पूर्णांक स्थिरांक
- 18. स्ट्रिंग स्थिरांक
- 19. स्थिरांक वस्तु
- 20. अप्रारंभीकृत स्थिरांक
- 21. स्थिरांक संकेत
- 22. स्टेटिक स्थिरांक
- 23. ऑटोलोडिंग स्थिरांक?
- 24. स्थिरांक क्षेत्रों
- 25. घोषणा स्थिरांक
- 26. परिकलित स्थिरांक
- 27. कैसे एक JSP पेज में स्थिरांक आयात करने के लिए
- 28. कैसे घोषित करने और NSString वैश्विक स्थिरांक
- 29. "स्थिरांक आईडी" के व्यवहार
- 30. struct के स्थिरांक गुण
कृपया शुद्ध कोड के रूप में एक स्पष्टीकरण जोड़ें, ज्यादा नहीं कहता है। – Kao
आपको GetBuffer की आवश्यकता नहीं है। सीएसटींग में एक एलपीसीटीआर ऑपरेटर है जो आंतरिक बफर तक पहुंचता है। – MikMik
यदि 'wc' 'привет мир' है तो आउटपुट क्या होना चाहिए? क्या आप कोड पृष्ठों के बारे में परवाह करते हैं या यह सिर्फ विस्तृत है -> सभी विस्तृत वर्णों के साथ संकीर्ण रूपांतरण एएनएसआई वर्ण हैं? –