次のコードのように、CString ←→ BSTRの変換を行いたいのですが、データがUTF8だと文字化けしてしまいます。
どうすれば良いでしょうか?
環境:VC++7(.net 2003)+MFC+WinXP
【結果】
CString--------------------------
FFFFFFE2 FFFFFF97 FFFFFF8B 3C
BSTR--------------------------
FFFFFFE2 FFFFFF97 FFFFFF81 45
【ソース】
int intCT;
int nSize = 0;
BYTE *pSource = (BYTE *)"○<";
this->ConvSJistoUtf8(pSource, (BYTE *)NULL, &nSize );
BYTE* pDist = new BYTE[ nSize + 1 ];
ZeroMemory( pDist, nSize + 1 );
this->ConvSJistoUtf8(pSource, pDist, &nSize );
CString str = CString(pDist);
delete []pDist;
pDist = NULL;
BSTR bstr;
bstr=str.AllocSysString();//CString→BSTRへの変換
CString str2=CString(bstr);//BSTR→CStringへの変換
TRACE("CString--------------------------\n ");
for( intCT = 0; intCT < str.GetLength(); intCT++ )
{
if( intCT%16 == 0 ) TRACE("\n");
TRACE("%02X " , str[intCT]);
}
TRACE("\n ");
TRACE("BSTR--------------------------\n ");
for( intCT = 0; intCT < str2.GetLength(); intCT++ )
{
if( intCT%16 == 0 ) TRACE("\n");
TRACE("%02X " , str2[intCT]);
}
TRACE("\n ");
BOOL ConvSJistoUtf8( BYTE* pSource, BYTE* pDist, int* pSize )
{
*pSize = 0;
//ShiftJISからUTF-16へ変換
const int nSize = ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, NULL, 0 );
BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ];
::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, (LPWSTR)
buffUtf16, nSize );
//UTF-16からShift-JISへ変換
const int nSizeUtf8 = ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)
buffUtf16, -1, NULL, 0, NULL, NULL );
if( !pDist ){
*pSize = nSizeUtf8;
delete buffUtf16;
return TRUE;
}
BYTE* buffUtf8 = new BYTE[ nSizeUtf8 * 2 ];
ZeroMemory( buffUtf8, nSizeUtf8 * 2 );
::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)buffUtf16, -1, (LPSTR)
buffUtf8, nSizeUtf8, NULL, NULL );
*pSize = lstrlen( (char*)buffUtf8 );
memcpy( pDist, buffUtf8, *pSize );
delete buffUtf16;
delete buffUtf8;
return TRUE;
}
No.1ベストアンサー
- 回答日時:
CString ←→ BSTRの変換以前に
>CString str = CString(pDist);
の時点で文字化けしてるんじゃないでしょうか?
int nSize = 0;
BYTE *pSource = (BYTE *)"○<";
// ASCII → CString
TRACE( "ASCII → CString\n " );
CString strA = CString( pSource );
TRACE( "%s\n ", strA );
for( int count = 0; count < strA.GetLength(); count++ ) {
TRACE( "%02X ", strA[ count ] );
}
TRACE( "\n\n" );
ConvSJistoUtf8( pSource, ( BYTE * )NULL, &nSize );
BYTE* pDist = new BYTE[ nSize + 1 ];
ZeroMemory( pDist, nSize + 1 );
ConvSJistoUtf8( pSource, pDist, &nSize );
// UTF8 → CString
TRACE("UTF8 → CString\n ");
CString str = CString( pDist );
TRACE( "%s\n ", str );
delete []pDist;
pDist = NULL;
for( int count = 0; count < str.GetLength(); count++ ) {
TRACE( "%02X ", str[ count ] );
}
Shift-JIS か UTF-16 で初期化しないとダメなのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
-
4
CStringをwchar_tに変換したい
C言語・C++・C#
-
5
STLのwstring型から BSTR型 への変換
C言語・C++・C#
-
6
regsvr32で登録された一覧を知りたい
UNIX・Linux
-
7
charからLPTSTRへの変換方法
C言語・C++・C#
-
8
wsprintf関数の使い方について
C言語・C++・C#
-
9
画面を強制的に再描画させる方法
C言語・C++・C#
-
10
ATLについて
C言語・C++・C#
-
11
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
12
CString Format にて全角空白文字連続して格納する方法は?
C言語・C++・C#
-
13
CStringの配列要素を関数で受け渡しするには?
C言語・C++・C#
-
14
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
15
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
16
C++ 構造体の一括初期化 {0}
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
セル内の文字列が日本語か英語...
-
ふりがなをアルファベット化す...
-
EBCDICへの変換
-
error C2679 がとれません><
-
VS 2008(VB.NET)
-
Symfowareでのデータ型変換につ...
-
ExcelVBA実行後に時々落ちる
-
C++でEUC-JPをSJISに変換したい。
-
VBAでbmp画像をASCIIデータとし...
-
S-JIS → JIS コード変換するには
-
Excelマクロにて30分単位の計算...
-
VisualBasic6からVB2005に移行...
-
VBでバイナリデータについて。
-
JIS → S-JIS コード変換するには
-
VB.NETで子ウィンドウの...
-
コード変換について
-
シフト演算を用いた変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
Symfowareでのデータ型変換につ...
-
COBOLによる全角・半角混...
-
ふりがなをアルファベット化す...
-
VS 2008(VB.NET)
-
Excelマクロにて30分単位の計算...
-
CASLⅡ 文字データから数値デー...
-
sedで日本語の置換方法について
-
S-JIS → JIS コード変換するには
-
フォームのコントロールのバッ...
-
JIS → S-JIS コード変換するには
-
VB.NETのコンソールアプリケー...
-
「髙(はしごたか)」を文字コー...
-
画像データ(png)をcsvファイル...
-
友人とのラインで 「~MBと書く...
-
2バイト文字をJEFからSJISに変...
おすすめ情報