2009-03-09 11 views
9

Japonca metin içeren bir _bstr_t dizilim var. Bu dize, char * olarak tanımlanan bir UTF-8 dizesine dönüştürmek istiyorum._bstr_t to UTF-8 mümkün mü?

_bstr_t dizesini Japonca karakterleri kaybetmeden char * (UTF-8) dizesine dönüştürebilir miyim?

cevap

15

WideCharToMultiByte() öğesini kullanın - ilk parametre olarak CP_UTF8 değerini geçirin.

BSTR'ın boş bir dize olabileceğine ve boş bir dizeye karşılık geldiğine dikkat edin; bunu özel bir durum olarak ele alın. Bu tür bir şey için

-1

Çok kullanışlı MSDN referansı: http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx

Sana emin değilim rağmen karakter * Unicode şeyler kaybedersiniz çünkü * wchar_t gitmek gerektiğini düşünüyorum.

// 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

Cevabınız için teşekkürler Nick. Sorun şu ki, bu _bstr_t içeriğini sadece char * tipinin gönderilmesine izin veren Windows soketi üzerinden göndermek istiyorum (ws2def.h dosyasında WSABUF yapısını kontrol ediniz). Şimdi bir wchat yapmaz. _WSABUF yapısının geniş bir char sürümü var mı? –

+2

Windows Sockets gönderdiğiniz verileri umursamıyor. Bu durumda sadece char * için yeniden yorum yazabilir ve iyi olabilirsiniz. – sharptooth

+0

Sadece bayt sayısıyla karıştırmayın - Unicode karakterleri sayısı sizeof (WCHAR) sayısı - ve boş BSTR'lerle. – sharptooth

1

Dönüştürmeyi yapması gereken bazı kodlar.

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); 
}