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

7 に答える 7

33

これを試すこともできます:

#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(ie TCHAR*) としない LPCTSTR(ie const TCHAR*)。

もう 1 つのオプションは、変換マクロを使用することです。

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

このアプローチの問題は、変換された文字列のメモリがスタックに割り当てられるため、文字列の長さが制限されることです。ただし、この一連の変換マクロを使用すると、変換に使用するコード ページを選択できます。これは、ワイド文字列に非 ANSI 文字が含まれている場合に必要になることがよくあります。

于 2012-09-28T10:10:16.567 に答える
12

sprintfこの目的のために使用できます:

const char output[256];
const WCHAR* wc = L"Hellow World" ;
sprintf(output, "%ws", wc );
于 2014-04-04T11:49:07.590 に答える
4

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
于 2017-06-05T18:48:21.303 に答える
1

これを行うか、よりクリーンな方法を実行できます。

std::wcout << L"output: " << output.GetString() << std::endl;
于 2012-09-28T10:00:42.023 に答える
1

CStringは の typedef にすぎず、 andCStringTにもアクセスできるため、非常に簡単です(違いについてはドキュメントを読む必要があります)。CStringACStringW

CStringW myString = L"Hello World";
CString myConvertedString = myString;
于 2012-09-28T10:13:11.893 に答える