2012-09-28 75 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。 CString有一個訪問內部緩衝區的LPCTSTR操作符。 – MikMik

+1

如果'wc'是'приветмир',應該輸出什麼?你關心的代碼頁或這只是寬 - 窄轉換所有寬字符是ANSI字符? –

回答

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::GetBuffer返回LPTSTR(即TCHAR*)和而不是LPCTSTR(即const TCHAR*)。

另一種選擇是使用轉換宏:

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

這種方法的問題在於,對於轉換後的字符串的存儲器堆棧分配的,所以該字符串的長度是有限的。但是,這種轉換宏系列允許您選擇要用於轉換的代碼頁,如果寬字符串包含非ANSI字符,則這通常是需要的。

+0

我很想嘗試+1。當你真的需要ATL在C++ – sehe

+0

中做一個體面的COM組件時,'_bstr_t'和'_variant_t'曾經是我最好的朋友,但它沒有將wc複製到c – jack

+0

爲什麼要複製它?你的代碼只顯示你需要在'printf'中使用它。 '_bstr_t'將負責釋放內存。如果需要保留副本併發送字符串,請使用'_bstr_t'實例,而不是'const char *' - 從這個意義上說,'_bstr_t'與'CString'類似。當使用對象的多個副本時(儘管它不使用* copy-on-write *),它會正確地複製字符串數據。 –

1

你可以這樣做,或者你可以做一些清潔劑:

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

爲什麼要使用'GetBuffer()'?這裏是'GetString()'官方C字符串getter! – Rost

+0

@複製粘貼:D無需大喊:D –

+2

複製粘貼是邪惡的!真正的開發人員總是通過char重新輸入char!你不知道嗎?!? :-D – Rost

1

這是很容易的,因爲CString僅僅是CStringT一個typedef,你也有機會獲得CStringACStringW(你應該閱讀有關差異的文檔)。

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

'CStringA myConvertedString(L「Hello World」);'也可以工作 – Rost

+0

是的,我意識到這一點,但它寫的更接近他的示例代碼。 –

+0

此轉換對沒有匹配窄字符的寬字符做什麼? –

5

您可以使用sprintf用於此目的:

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

我不認爲你可以將'output'聲明爲'const' – CinCout

2

我對Linux的

// 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 
相關問題