2009-03-09 5 views
9

J'ai une chaîne _bstr_t qui contient du texte japonais. Je veux convertir cette chaîne en une chaîne UTF-8 qui est définie comme char *. Puis-je convertir la chaîne _bstr_t en chaîne char * (UTF-8) sans perdre les caractères japonais?_bstr_t à UTF-8 possible?

Répondre

15

Utiliser WideCharToMultiByte() - Passer CP_UTF8 comme premier paramètre.

Prenez garde que BSTR peut être un pointeur nul et cela correspond à une chaîne vide - traitez cela comme un cas particulier.

-1

Très pratique référence MSDN pour ce genre de chose: http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx

Je pense que vous devez aller à wchar_t * depuis char * perd les choses Unicode, même si je ne suis pas sûr.

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

Merci pour votre réponse Nick. Le problème est que je veux envoyer ce contenu _bstr_t via le socket Windows qui permet uniquement d'envoyer le type char * (veuillez vérifier la structure WSABUF dans le fichier ws2def.h). Maintenant, un wont ne le fera pas. Existe-t-il une version de char large de la structure _WSABUF? –

+2

Windows Sockets ne se soucie pas des données que vous envoyez. Dans ce cas, vous pouvez juste réinterpréter_cast en char * et être bien. – sharptooth

+0

Juste ne pas gâcher avec le nombre d'octets - c'est le nombre de caractères Unicode fois sizeof (WCHAR) - et avec null BSTRs. – sharptooth

1

Voici un code qui devrait faire la conversion.

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