如何将const WCHAR*转换为const char*

jac*_*ack 12 c++

CString output ;
const WCHAR* wc = L"Hellow World" ;
if( wc != NULL )
{   
     output.Append(wc);
}
printf( "output: %s\n",output.GetBuffer(0) );
Run Code Online (Sandbox Code Playgroud)

Zde*_*vic 22

你也可以试试这个:

#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);
Run Code Online (Sandbox Code Playgroud)

_bstr_t 实现以下转换运算符,我觉得非常方便:

operator const wchar_t*( ) const throw( ); 
operator wchar_t*( ) const throw( ); 
operator const char*( ) const; 
operator char*( ) const;
Run Code Online (Sandbox Code Playgroud)

编辑:关于答案评论的澄清:行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);
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于转换后的字符串的内存是在堆栈上分配的,因此字符串的长度是有限的.但是,此系列转换宏允许您选择要用于转换的代码页,如果宽字符串包含非ANSI字符,则通常需要该代码页.


l0p*_*pan 7

您可以sprintf为此目的使用:

const char output[256];
const WCHAR* wc = L"Hellow World" ;
sprintf(output, "%ws", wc );
Run Code Online (Sandbox Code Playgroud)

  • 我认为您不能将output声明为const。 (3认同)

Ale*_*gin 6

我的 Linux 代码

\n\n
// Debian GNU/Linux 8 "Jessie" (amd64)\n\n#include <locale.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n// Use wcstombs(3) to convert Unicode-string (wchar_t *) to UTF-8 (char *)\n// http://man7.org/linux/man-pages/man3/wcstombs.3.html\n\nint f(const wchar_t *wcs) {\n        setlocale(LC_ALL,"ru_RU.UTF-8");\n        printf("Sizeof wchar_t: %d\\n", sizeof(wchar_t));\n        // on Windows, UTF-16 is internal Unicode encoding (UCS2 before WinXP)\n        // on Linux, UCS4 is internal Unicode encoding\n        for (int i = 0; wcs[i] > 0; i++) printf("%2d %08X\\n",i,wcs[i]);\n        char s[256];\n        size_t len = wcstombs(s,wcs,sizeof(s));\n        if (len > 0) {\n                s[len] = \'\\0\';\n                printf("mbs: %s\\n",s);\n                for (int i = 0; i < len; i++)\n                        printf("%2d %02X\\n",i,(unsigned char)s[i]);\n                printf("Size of mbs, in bytes: %d\\n",len);\n                return 0;\n        }\n        else return -1;\n}\n\nint main() {\n        f(L"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"); // 6 symbols\n        return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何建造

\n\n
#!/bin/sh\nNAME=`basename $0 .sh`\nCC=/usr/bin/g++-4.9\nINCS="-I."\nLIBS="-L."\n$CC ${NAME}.c -o _${NAME} $INCS $LIBS\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
$ ./_test \nSizeof wchar_t: 4\n 0 0000041F\n 1 00000440\n 2 00000438\n 3 00000432\n 4 00000435\n 5 00000442\nmbs: \xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82\n 0 D0\n 1 9F\n 2 D1\n 3 80\n 4 D0\n 5 B8\n 6 D0\n 7 B2\n 8 D0\n 9 B5\n10 D1\n11 82\nSize of mbs, in bytes: 12\n
Run Code Online (Sandbox Code Playgroud)\n