UTF8→UTF16の変換方法

解決


テン  2007-01-05 03:27:35  No: 64161

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
どなたかご教授のほど、よろしくおねがいします。


Blue  2007-01-05 03:32:19  No: 64162

結局CStringで持つ場合、VC6の環境ではデフォルトでMBCSになるので
UnicodeがShift_JISに変換されてしまいます。

ですので、そのままUnicodeで扱うクラス CComBSTRクラスや_bstr_tクラスを使って、
確認時には、〜WのようなAPIを使うべきでしょう。→つまりMFCは使えない。
(もっとも、UNICODEでコンパイルすればよいけど。)


Blue  2007-01-05 03:37:47  No: 64163

>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で検索してみるとよいでしょう。


Blue  2007-01-05 03:52:09  No: 64164

ほかの掲示板で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;
}


テン  2007-01-05 09:06:01  No: 64165

Blue様  ご回答ありがとうございます。

実はCStringに格納したかったのは、その後にRFX_Textを使ってSQLServerのストアドへ引き渡したかったのですが、SJISになってしまうのですね。
(申し訳ありません別スレッドでこの件も質問させていただきます。)

スレッドタイトルの件に関して理解できましたので解決とさせていただきます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加