UTF8からUTF16へ変換し、その後CString型の変数に格納したく
下記の様な関数を作り使用しているのですが上手く行きません。
void Utf8ToUnicode(wchar_t *pout, char *pin)
{
int cchWideChar = MultiByteToWideChar(CP_UTF8, 0, pin, sizeof(pin), NULL, 0);
LPWSTR lpWideString = new WCHAR[cchWideChar];
MultiByteToWideChar(CP_UTF8, 0, pin, sizeof(pin), lpWideString, cchWideChar);
int nUnicodeCount = MultiByteToWideChar(CP_UTF8, 0, pin, -1, pout, cchWideChar);
return ;
}
void main()
{
wchar_t wbuf[5012];
char s[] ="いろはにほ" //本当は外国語が入ります。
Utf8ToUnicode(wbuf,s);
CString StrTmp((LPCWSTR)wbuf,sizeof(wbuf));
}
開発環境 Windows2000 VC++6.0
どなたかご教授のほど、よろしくおねがいします。
結局CStringで持つ場合、VC6の環境ではデフォルトでMBCSになるので
UnicodeがShift_JISに変換されてしまいます。
ですので、そのままUnicodeで扱うクラス CComBSTRクラスや_bstr_tクラスを使って、
確認時には、〜WのようなAPIを使うべきでしょう。→つまりMFCは使えない。
(もっとも、UNICODEでコンパイルすればよいけど。)
>MultiByteToWideChar(CP_UTF8, 0, pin, sizeof(pin), NULL, 0);
>MultiByteToWideChar(CP_UTF8, 0, pin, sizeof(pin), lpWideString, cchWideChar);
sizof(pin)ではなく、strlen(pin)では。
>LPWSTR lpWideString = new WCHAR[cchWideChar];
>MultiByteToWideChar(CP_UTF8, 0, pin, sizeof(pin), lpWideString, cchWideChar);
この変数必要でしょうか?
ちなみに文字コード変換は過去ログで幾度か出てきています。
MultiByteToWideCharで検索してみるとよいでしょう。
ほかの掲示板でUTF8->CStringのコードを書いたのでちょっといじってみた。
http://m--takahashi.com/bbs/default.aspx?c=14061
#include <afxwin.h>
#include <comdef.h>
BOOL UTF8ToUTF16(const char*& data, const DWORD len, _bstr_t& text)
{
BOOL result = FALSE;
text = L"";
if (!data) return FALSE;
if (!len) return TRUE;
const int wlen = ::MultiByteToWideChar(CP_UTF8, 0, data, len, NULL, 0);
if (!wlen) return FALSE;
WCHAR* buff = new WCHAR[wlen + 1];
if (::MultiByteToWideChar(CP_UTF8, 0, data, len, buff, wlen))
{
result = TRUE;
buff[wlen] = L'\0';
text = buff;
}
delete[] buff;
return result;
}
int main()
{
// UTF-8の あいうえお
const char* str = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
_bstr_t bs;
if (UTF8ToUTF16(str, strlen(str), bs))
{
::MessageBoxW(NULL, bs, L"", MB_OK);
}
return 0;
}
Blue様 ご回答ありがとうございます。
実はCStringに格納したかったのは、その後にRFX_Textを使ってSQLServerのストアドへ引き渡したかったのですが、SJISになってしまうのですね。
(申し訳ありません別スレッドでこの件も質問させていただきます。)
スレッドタイトルの件に関して理解できましたので解決とさせていただきます。
ありがとうございました。
ツイート | ![]() |