トップ回答者
MBCSとUNICODEの混在

質問
回答
-
単純にアプリを Unicode に変更するわけにはいかないのでしょうか?
といいますのも、
やりたいことは仰るとおりSHIFT_JISで表せない文字も表示したいのです。
SHIFT_JIS で表せない文字は MBCS には保持できないので、そのような文字が入る可能性がある箇所では MBCS を使わずに wchar_t ベースのコードに置き換えないといけなくなると思うのです。
例えば、「𠮟」(口へんに七)は Shift-JIS には対応する文字コードがないですが、こういうのは char のバッファに入れた時点で「??」に化けてしまいます。Unicode に再度戻そうとしても戻ることはありません。- 回答としてマーク 村尾DOS 2012年8月20日 8:18
すべての返信
-
説明不足ですみません。
テキストボックスはダイアログバーに配置しています。
CString strMBCS = "文字列"; int nLen; WCHAR* pszUnicode; nLen = ::MultiByteToWideChar(CP_THREAD_ACP, 0, strMBCS, -1, NULL,0); pszUnicode = new WCHAR[nLen]; ::MultiByteToWideChar(CP_THREAD_ACP, 0, strMBCS, strMBCS.GetLength()+1, pszUnicode, nLen); pBar->SetDlgItemText(IDC_TEXT, pszUnicode); delete pszUnicode;
この様にしたところ、「'WCHAR *' から 'LPCTSTR'に変換できません」というエラーメッセージが出ます。
-
CString strMBCS = "文字列";
↓
CStringA strMBCS = "文字列"; もしくは CStringA strMBCS( "文字列" ); です。
このコードの目的がよくわかりません。一旦MBCSで格納できるのならそのまま表示すればいいと思います。つまりコードで示すなら
CString str( _T("文字列") ); pBar->SetDlgItemText(IDC_TEXT, str);
かな?
MBCS(日本語ではSHIFT_JIS)で表現できない文字も扱いたいということでしょうか? であれば、直接SetDlgItemText()を呼ぶしかないのかな。
CStringW strUNICODE( L"SHIFT_JISで表せない文字も含む…というかソースコードがSHIFT_JISならこれでも表現できないが…" ); ::SetDlgItemTextW( (HWND)pBar, IDC_TEXT, strUNICODE );
とかでしょうか。
文字コード変換も文字列変換クラスがあるのでこちらを使ったほうが楽です。コードを見る限り、char / wchar_t / TCHARの区別ができていないように見えます。
- 編集済み 佐祐理 2012年8月19日 8:26
-
単純にアプリを Unicode に変更するわけにはいかないのでしょうか?
といいますのも、
やりたいことは仰るとおりSHIFT_JISで表せない文字も表示したいのです。
SHIFT_JIS で表せない文字は MBCS には保持できないので、そのような文字が入る可能性がある箇所では MBCS を使わずに wchar_t ベースのコードに置き換えないといけなくなると思うのです。
例えば、「𠮟」(口へんに七)は Shift-JIS には対応する文字コードがないですが、こういうのは char のバッファに入れた時点で「??」に化けてしまいます。Unicode に再度戻そうとしても戻ることはありません。- 回答としてマーク 村尾DOS 2012年8月20日 8:18