日本語のテキストを含む_bstr_t
文字列があります。この文字列をchar *
として定義されているUTF-8文字列に変換したいと思います。_bstr_tからUTF-8まで可能ですか?
_bstr_t
文字列をchar *
(UTF-8)文字列に変換することはできますか?
日本語のテキストを含む_bstr_t
文字列があります。この文字列をchar *
として定義されているUTF-8文字列に変換したいと思います。_bstr_tからUTF-8まで可能ですか?
_bstr_t
文字列をchar *
(UTF-8)文字列に変換することはできますか?
WideCharToMultiByte()を使用します。最初のパラメータとしてCP_UTF8を渡します。
BSTRは空の文字列に対応し、空の文字列に対応することに注意してください。これは特別なケースとして扱います。この種のもののために
非常に便利な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;
}
ここで、変換を行う必要があるコードを示します。
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);
}
返信いただきありがとうございます。問題は、char *型のみを送信できるWindowsソケット経由でこの_bstr_tコンテンツを送信したいということです(ws2def.hファイルのWSABUF構造体をチェックしてください)。今wchatはしません。 _WSABUF構造体のワイド文字版はありますか? –
Windowsソケットは送信するデータを気にしません。この場合は、reinterpret_castをchar *に変更しても問題ありません。 – sharptooth
ちょうどバイト数で台無しにしないでください。それはsizeof(WCHAR)のUnicode文字数とヌルBSTRsの数です。 – sharptooth