シフトJIS から Unicode へ変換

[戻る]
2002/05/03(金) 17:02:11
はじめまして龍と申します。

ここ最近、VC++をはじめました
よろしくお願いします。

 char szTest[255] = {("た")};
 char sztest[1];
 memset( sztest, 0x00, sizeof( sztest ) );
 char* pszTest = szTest;
 CString cstrCode;
 int nCounter = 0;
 while ( TRUE ) {
  if ( *pszTest == '\0' ) {
    break;
  }
  sztest[0] = *pszTest;
  BYTE nCode = (BYTE)(*sztest);
  CString cstrValue;
  cstrValue.Format( "%x", (unsigned long)nCode );
  cstrCode += cstrValue;
  pszTest++;
  nCounter++;
 }

今回、上記のようなソースで文字コードを取得しています。
しかし、返ってくる文字コードがシフトJISで困ってます。

上記ソースを実行して頂くと
cstrCodeに「82db」が返ってきます。

これはシフトJISで最終的に欲しいのはUnicodeの「305F」

 char szTest[255] = {("た")};
をUnicodeに変換すればいいと思うのですが
HELP等を探しても一向に見つかりません。

どなたかお力をお貸し願えませんでしょうか?
よろしくお願いします。

中級者X 2002/05/03(金) 17:25:35
MultiByteToWideCharを調べてみましょう。

2002/05/03(金) 19:16:16
[[解決]]
中級者X様ありがとうございました。
MultiByteToWideCharを利用して実現できました。

下記のソースにて実現できました。


char szTest[255] = {("た")};
char szBuffer[256];
strcpy( szBuffer, szTest );
int nLen = MultiByteToWideChar(CP_ACP, 0,szTest, -1, NULL, NULL);
LPWSTR lpszW = new WCHAR[nLen];
MultiByteToWideChar(CP_ACP, 0, szTest, -1, lpszW, nLen);
CString cstrUCode;
int i=0;
while ( TRUE ) {
    if ( lpszW[i] == NULL ) {
        break;
    }
    CString cstrValue;
    cstrValue.Format( "0000%X", (unsigned long)lpszW[i] );
    cstrUCode += cstrValue.Right(4);
    i++;
}
delete[] lpszW;

テン 2002/05/03(金) 21:00:58
COMの本に _T() というマクロがのってました
よかったら参考にしてください。
ただし、こちらも初心者なので詳しいことはわからないです...

char szTest[255] = {("た")};
char szBuffer[256];
strcpy( szBuffer, szTest );
_bstr_t    bstrt;        //#include <comdef.h> が必要
bstrt = _T(szBuffer);    //bstrt = _T("た"); でもおなじ
//int nLen = MultiByteToWideChar(CP_ACP, 0,szTest, -1, NULL, NULL);
//LPWSTR lpszW = new WCHAR[nLen];
LPWSTR lpszW = new WCHAR[sizeof(_T(szBuffer))];
//MultiByteToWideChar(CP_ACP, 0, szTest, -1, lpszW, nLen);
lpszW = bstrt;

YuO [E-Mail] 2002/05/03(金) 22:05:04
_T(szBuffer)はだめです。

_Tというのは,簡単に書くと
#if defined(_UNICODE)
#define _T(s) (L##s)
#else
#define _T(s) (s)
#endif
というマクロです。

単純に書き直すと,
wchar_t szTest[255] = L"た"; // WCHAR is wchar_t's typedef.
CString cstrUCode;
int i=0;
while ( TRUE ) {
    if ( szTest[i] == NULL ) {
        break;
    }
    CString cstrValue;
    cstrValue.Format( "0000%X", (unsigned long)szTest[i] );
    cstrUCode += cstrValue.Right(4);
    i++;
}
という感じでしょうか。
ループは,
for (int i = 0; szTest[i]; ++i) {
    cstrUCode += CString().Format("%04X", szTest[i]);
}
と簡略化できますね。
#文字\0 (NULL CHARACTER)とNULL (NULL POINTER)は区別した方がよいです。

テン 2002/05/04(土) 01:04:49
YuOさん初めまして
そうですね、_Tマクロはリテラル文字、文字列のみあつかうマクロでした。
ただ疑問に思うことがあるのです。
あとで[考えを整理した後]新しいスレッドを立てようと思います。

古いスレッドには追加発言できません。