_bstr_t 转换为 UTF-8 可行吗?

9

我有一个包含日语文本的_bstr_t字符串。我想将此字符串转换为UTF-8字符串,该字符串定义为char *

我能否将_bstr_t字符串转换为char *(UTF-8)字符串而不丢失日语字符?

3个回答

16

使用WideCharToMultiByte()函数 – 将CP_UTF8作为第一个参数传递。

请注意,BSTR可能为空指针,这对应于空字符串 - 将其视为特殊情况处理。


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

-1

这种情况下非常方便的MSDN参考资料:http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx

我认为你需要使用wchar_t*,因为char*会丢失Unicode内容,尽管我不确定。

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

谢谢你的回复,Nick。问题是我想通过Windows套接字发送这个_bstr_t内容,但它只允许发送char*类型(请检查ws2def.h文件中的WSABUF结构)。现在wchar是不行的。是否有_WASBUF结构的宽字符版本? - Manav Sharma
2
Windows套接字不关心您发送什么数据。在这种情况下,您只需将reinterpret_cast转换为char *即可。 - sharptooth
不要搞混字节数量 - 它是Unicode字符数量乘以sizeof(WCHAR) - 以及空的BSTR。 - sharptooth
尽管Windows套接字不关心发送的数据,但如果目标需要理解数据并且使用不同的字节顺序,则最好使用UTF-8。特别是在混合环境中,其中使用具有两种字节顺序的系统。 - Afriza N. Arief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接