トップ回答者
UNICODE CStringからShift-JIS char*への変換方法

質問
回答
-
UTF-8ならWideCharToMultiByteでも出来ますね。
一応、(私が使っていた)CStringからバイト型配列へ変換するコードです。
メモリ管理が面倒なので、afxtempl.hのCByteArrayを使っています。
SampleBOOL XXXXX::ConvertUTF8(const CString src, CByteArray& dest) const { _bstr_t bSrc(src); dest.RemoveAll(); const int len =
::WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0, NULL, NULL); if (len > 0) { dest.SetSize(len); if (::WideCharToMultiByte(CP_UTF8, 0, bSrc, -1,
static_cast<LPSTR>(static_cast<void*>(dest.GetData())),
len, NULL, NULL)) return TRUE; } return FALSE; }
で、UTF-8のファイルを出力するときに使っています。
SampleBOOL XXXXX::OutputFile() { TRY { CFile f(this->m_Target,
CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone); CByteArray bin; // BOM f.Write("\xEF\xBB\xBF", 3); this->ConvertUTF8(
_T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n"),
bin); f.Write(bin.GetData(), bin.GetSize() - 1); f.Close(); } CATCH (CFileException, ex) { TCHAR err[524]; ex->GetErrorMessage(err, sizeof(err) / sizeof(err[0])); AfxMessageBox(err); return FALSE; } END_CATCH return TRUE; }
すべての返信
-
変換方法はいくつかあります。
- APIの WideCharToMultiByte をつかう。
- データ変換関数の wctomb(wctomb_s) をつかう。
- ATLのマクロ W2A をつかう。
- _bstr_tクラスをつかう。
- その他のコンポーネント(ADODB.Streamとかmlangライブラリとか)をつかう。
- CLRを使えるようにして、.NETのクラスのSystem.Text.Encodingあたりをつかう。
のいずれかでしょう。
(個人的に_bstr_tが簡単で使いやすいと思っています。)
本格的なコード変換(5点目の使い方)については
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=613442&SiteID=7
を参考にしてください。
ちなみにShift_JIS→CStringはコンストラクタがあるのでコード変換についてはCString
がやってくれます。 - APIの WideCharToMultiByte をつかう。
-
-
UTF-8ならWideCharToMultiByteでも出来ますね。
一応、(私が使っていた)CStringからバイト型配列へ変換するコードです。
メモリ管理が面倒なので、afxtempl.hのCByteArrayを使っています。
SampleBOOL XXXXX::ConvertUTF8(const CString src, CByteArray& dest) const { _bstr_t bSrc(src); dest.RemoveAll(); const int len =
::WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0, NULL, NULL); if (len > 0) { dest.SetSize(len); if (::WideCharToMultiByte(CP_UTF8, 0, bSrc, -1,
static_cast<LPSTR>(static_cast<void*>(dest.GetData())),
len, NULL, NULL)) return TRUE; } return FALSE; }
で、UTF-8のファイルを出力するときに使っています。
SampleBOOL XXXXX::OutputFile() { TRY { CFile f(this->m_Target,
CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone); CByteArray bin; // BOM f.Write("\xEF\xBB\xBF", 3); this->ConvertUTF8(
_T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n"),
bin); f.Write(bin.GetData(), bin.GetSize() - 1); f.Close(); } CATCH (CFileException, ex) { TCHAR err[524]; ex->GetErrorMessage(err, sizeof(err) / sizeof(err[0])); AfxMessageBox(err); return FALSE; } END_CATCH return TRUE; }