シフトJIS から Unicode へ変換 – プログラミング – Home

シフトJIS から Unicode へ...
 
通知
すべてクリア

[解決済] シフトJIS から Unicode へ変換


龍
 龍
(@龍)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

はじめまして龍と申します。

ここ最近、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
 中級者X
(@中級者X)
ゲスト
結合: 23年前
投稿: 26
 

MultiByteToWideCharを調べてみましょう。


返信引用
龍
 龍
(@龍)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

中級者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;


返信引用
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
 

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
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

_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)は区別した方がよいです。


返信引用
テン
 テン
(@テン)
ゲスト
結合: 23年前
投稿: 35
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました