2009-03-09 1 views
9

日本語のテキストを含む_bstr_t文字列があります。この文字列をchar *として定義されているUTF-8文字列に変換したいと思います。_bstr_tからUTF-8まで可能ですか?

_bstr_t文字列をchar *(UTF-8)文字列に変換することはできますか?

答えて

15

WideCharToMultiByte()を使用します。最初のパラメータとしてCP_UTF8を渡します。

BSTRは空の文字列に対応し、空の文字列に対応することに注意してください。これは特別なケースとして扱います。この種のもののために

-1

非常に便利なMSDNの参照:http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx

は、私はあなたが私にはわからないが、char型の*は、Unicodeのものを失うことになるので、* wchar_tに行く必要があると思います。

// convert_from_bstr_t.cpp 
// compile with: /clr /link comsuppw.lib 

#include <iostream> 
#include <stdlib.h> 
#include <string> 

#include "atlbase.h" 
#include "atlstr.h" 
#include "comutil.h" 

using namespace std; 
using namespace System; 

int main() 
{ 
    _bstr_t orig("Hello, World!"); 
    wcout << orig << " (_bstr_t)" << endl; 

    // Convert to a char* 
    const size_t newsize = 100; 
    char nstring[newsize]; 
    strcpy_s(nstring, (char *)orig); 
    strcat_s(nstring, " (char *)"); 
    cout << nstring << endl; 

    // Convert to a wchar_t* 
    wchar_t wcstring[newsize]; 
    wcscpy_s(wcstring, (wchar_t *)orig); 
    wcscat_s(wcstring, L" (wchar_t *)"); 
    wcout << wcstring << endl; 

    // Convert to a CComBSTR 
    CComBSTR ccombstr((char *)orig); 
    if (ccombstr.Append(L" (CComBSTR)") == S_OK) 
    { 
     CW2A printstr(ccombstr); 
     cout << printstr << endl; 
    } 

    // Convert to a CString 
    CString cstring((char *)orig); 
    cstring += " (CString)"; 
    cout << cstring << endl; 

    // Convert to a basic_string 
    string basicstring((char *)orig); 
    basicstring += " (basic_string)"; 
    cout << basicstring << endl; 

    // Convert to a System::String 
    String ^systemstring = gcnew String((char *)orig); 
    systemstring += " (System::String)"; 
    Console::WriteLine("{0}", systemstring); 
    delete systemstring; 
} 
+0

返信いただきありがとうございます。問題は、char *型のみを送信できるWindowsソケット経由でこの_bstr_tコンテンツを送信したいということです(ws2def.hファイルのWSABUF構造体をチェックしてください)。今wchatはしません。 _WSABUF構造体のワイド文字版はありますか? –

+2

Windowsソケットは送信するデータを気にしません。この場合は、reinterpret_castをchar *に変更しても問題ありません。 – sharptooth

+0

ちょうどバイト数で台無しにしないでください。それはsizeof(WCHAR)のUnicode文字数とヌルBSTRsの数です。 – sharptooth

1

ここで、変換を行う必要があるコードを示します。

void PrintUtf8(const TCHAR* value) { 
    if (value == nullptr) { 
     printf(""); 
     return; 
    } 
    int n = WideCharToMultiByte(CP_UTF8, 0, value, -1, nullptr, 0, nullptr, nullptr); 
    if (n <= 0) { 
     printf(""); 
     return; 
    } 
    char* buffer = new char[n]; 
    WideCharToMultiByte(CP_UTF8, 0, value, -1, buffer, n, nullptr, nullptr); 
    printf("%s", buffer); 
    delete(buffer); 
} 
関連する問題