UTF8→ShiftJISに変換したいです!
VC++2010, MFCです。
参考ページ(↓)でできそうだったのですが、
http://www.sutosoft.com/oldroom/devdiary/20020504.html
UTF-8からShift_JISにしたいのは、メディアプレーヤーで作られた wpl ファイルも扱いたいからです。
具体的にいうと、ファイル一覧に プレイリストがあった場合、展開してメディアプレイヤーで開いて、再生後 【m3u ファイル】に(コーディングで)アウトプットするのが目的です。 ShiftJISに変換して、いったんファイルに出力してから、再度読込処理を行ってもかまいません。
BOOL C○○Dlg::UTF8ToShiftJIS(const CString& src, CString* dest)
{
int sizeOfString = (src.GetLength() + 1);
LPWSTR lpsz = new WCHAR[sizeOfString];
//LPSTR lpsz = new char[ sizeOfString ];
_tcscpy_s(lpsz, sizeOfString, src);
//strcpy_s(lpsz,sizeOfString, src);
//delete[] lpsz
//http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120010.txt
//char* orig = "Hello, World";
char* nstring;
nstring = new char[sizeOfString];
strcpy_s(nstring,sizeOfString, (LPCSTR)(lpsz));
// ●UTF8からUnicodeに変換した場合の長さを求める。●
//http://msdn.microsoft.com/ja-jp/library/cc448053.aspx
//const_cast<LPTSTR>(static_cast<LPCTSTR>(str)
int iWideLength = ::MultiByteToWideChar(CP_UTF8, 0,【1】nstring, src.GetLength(), NULL, 0);
if (iWideLength == 0)return FALSE;
LPWSTR lpWideString = new WCHAR[iWideLength];
int iLength;
if (
// ●UTF8からUnicodeに変換する。●
(::MultiByteToWideChar(CP_UTF8, 0, 【2】nstring, src.GetLength(), lpWideString, iWideLength) == 0)
// ●UnicodeからShift_JISに変換した場合の長さを求める。●
|| ((iLength = ::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, NULL, 0, NULL, NULL)) == 0)
// ●UnicodeからShift_JISに変換する。●
//http://msdn.microsoft.com/ja-jp/library/cc448089.aspx
|| (::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, 【3】(LPSTR)dest->GetBuffer(iLength), iLength, NULL, NULL) == 0)){
// ●変換に失敗●
delete lpWideString;
return FALSE;
}
// ●変換に成功●
delete lpWideString;
dest->ReleaseBuffer();
return TRUE;
}
・・・という風に少し修正をして、次のソースで呼び出しています。
CString src;
CFile file;
if (file.Open(FilePath, CFile::modeRead)){
DWORD iLength = file.GetLength();
//CString src;
file.Read(src.GetBuffer(iLength), iLength);
file.Close();
src.ReleaseBuffer(iLength);
CString dest;
if (UTF8ToShiftJIS(src, &dest) ==TRUE){
MessageBox (dest);
}
// ●この時点で、destにShift_JISに変換された文字列が格納されている。
}
以下(↓)を参考に、【1】~【3】の部分で、他のパターンもキャストしてみたのですが・・・
/* http://d.hatena.ne.jp/shikaku/20090519/p3
■[CPP][VC]LPCSTRなどのVC++の紛らわしい定義の意味
一見正体不明のVC++オリジナル定義。よーくみれば違いが分かる。名前 意味
LP *(ポインタ)
C const
TSTR TCHAR(char)
STR char
WSTR WCHAR(ユニコード用:2byte)
ゆえに定義 正体
LPSTR char*
LPCSTR const char*
LPTSTR TCHAR*
LPCTSTR const TCHAR*
LPWSTR WCHAR*
LPCWSTR const WCHAR*
となる。+/
できるだけスマートに記述したいです。エクセル版を作っていたときは、CreateObject("ADODB.Stream")を使っていたみたいです。ただ、VC++でどう書けばいいか、分かりませんυ
UTF8→UTF16→ShiftJIS ←これは、あまり、使いたくない 変換 です。
後は、これも参考になりそうですが、 http://www.softist.com/programming/sjis-utf8/sjis-utf8.htm
bufUTF8を何型でどこで宣言すればいいのか?分かりません。
これも(↓)はてなです。
http://www.s-cradle.com/developer/sophiaframework/sf_reference/ref.SFXTextEncoding.html
何回も試しましたが、TRUEが返ってきても、変換前と変換後をMessageBoxで比べてみても、変わりがなく、漢字や記号の羅列でしかありません。どうか教えてください。