- ベストアンサー
UTF8からShiftJISに変換する方法
- UTF8からShiftJISに変換する方法について説明します。
- メディアプレーヤーで作られたwplファイルを扱うために、UTF8からShiftJISに変換する必要があります。
- 現在のソースコードではUTF8からShiftJISに変換する処理が行われていますが、正しく変換されていないようです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CString型は、プロジェクトの文字セットの設定の影響を受けます。 ・”マルチバイト文字セットを使用する”の場合:CStringA ・”Unicode 文字セットを使用する”の場合:CStringW 異なる文字コードを扱う必要のあるプログラムでは、CString型ではなく、 CStringA, CStringW を使い分ける必要があります。 UTF-8 を格納する適切なCString型はありませんので、 ・バイナリデータとして扱う(通常はこちら) ・CStringA に格納する(次善の策) ぐらいかと思います。 残念ながら元のコードでは、プロジェクトがUnicode文字セットの設定の場合には、 動作する可能性がありません。 <コード例> BOOL C○○Dlg::UTF8ToShiftJIS(const CStringA& src, CStringA* dest) { // UTF-8 -> Unicode // int iWideLength = ::MultiByteToWideChar(CP_UTF8, 0, src, -1, NULL, 0); if (iWideLength == 0) return FALSE; CStringW temp; int iLength = ::MultiByteToWideChar(CP_UTF8, 0, src, -1, temp.GetBuffer(iWideLength), iWideLength); temp.ReleaseBuffer(); if (iLength == 0) return FALSE; // Unicode -> S-JIS は、CString 標準の変換を使用する。 // 何か問題がある場合は、::WideCharToMultiByte の使用を検討する。 // *dest = temp; return TRUE; } CStringA src; CFile file; if (file.Open(FilePath, CFile::modeRead)) { DWORD iLength = file.GetLength(); file.Read(src.GetBuffer(iLength), iLength); file.Close(); src.ReleaseBuffer(iLength); // ファイルから読み込んでるが、UTF-8 の BOM(EF, BB, BF)の扱いは大丈夫か? // static const BYTE utf8_bom[3] = { 0xEF, 0xBB, 0xBF }; if (::strncmp(src, reinterpret_cast<const char*>(utf8_bom), 3) == 0) { src.Delete(0, 3); } CStringA dest; if (UTF8ToShiftJIS(src, &dest)) { // 文字コードが S-JIS なので、ANSIバージョンを明示的に使用する必要がある // (MessageBox ではなくて、MessageBoxA) // ::MessageBoxA(m_hWnd, dest, "てすと", MB_OK); } }
その他の回答 (2)
- CanvasShoes
- ベストアンサー率64% (16/25)
下記の回答は誤りです。申し訳ありません。 -------------------- UTF8->ShiftJISは、 WideCharToMultiByte(CP_UTF8, .....); で、UNICODEを経由しなくても、1回で変換できると思います。 第1引数をCP_UTF8にしてください。
お礼
解決への きっかけ を作っていただき、感謝しています。
補足
回答ありがとうございます。 誤り、分かりました。 今は、心が折れて(?)しまったので、水曜日以降、もうちょっと試行錯誤してみようと思います。 極力、コード表とにらめっこでコーディングする事をさけ(←バグを排除するためにです)、VCに用意された命令で、実現したいです。 でも検索したら、文字コードを変換するフリーソフトが沢山ヒットしました。 簡単に作れるなら、それらのツールは不要なわけで・・・と、ここで質問した事との矛盾は感じています。(だから、しばらく回答が0だったのかも知れませんねυ) 質問にあるとおり、 http://www.sutosoft.com/oldroom/devdiary/20020504.html から、コードをコピーしたら、引数の所で、型が合わないというエラーがでたので、型だけ無理やりあわせました。 (つじつま合わせの型変換は意味ないのでしょうか?) 値渡しか、参照渡しか、の意味は分かりますが、正確な表記方法は分からないかもしれません。 ちなみに、言い忘れましたが、プロジェクトの設定は、ちゃんとユニコード対応にしています。 どなたからヒントだけでもいいので、教えていただけると嬉しいです。 ではでは。
- CanvasShoes
- ベストアンサー率64% (16/25)
UTF8->ShiftJISは、 WideCharToMultiByte(CP_UTF8, .....); で、UNICODEを経由しなくても、1回で変換できると思います。 第1引数をCP_UTF8にしてください。
お礼
分かりやすい説明と完全に動くソースコードまで、ありがとうございました! うまく行きました。 (メディアプレイヤーのパラメータに、大量のファイルのフルパスを一個一個与えて再生しようとすると、全然再生されない(遅い?)ようです。パラメータの長さに限りがあるのでしょうか?) (一度、プレイリスト(m3u)ファイルに出力して、そのファイルのフルパスをメディアプレイヤーのパラメータに与えると、早く処理されるようです。) では、締め切らせていただきますね。m(_ _)m
補足
凄いです!こんなにスマートにかけるなんて、ご回答ありがとうございました m(_ _)m 後は、もう少し検証してから(土曜日あたりに)締め切らせてもらいます。 エクセルの方でも、バイナリ形式で処理するサンプルがありますので、そこら変ももう一度見てみます。 今回は全てコーディングしてもらいましたが、VC初心者を免罪符にしないようにしたいですが、正直、難しいです。。。(ΘoΘ;) では。