• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UTF8→ShiftJISに変換したいです!)

UTF8からShiftJISに変換する方法

このQ&Aのポイント
  • UTF8からShiftJISに変換する方法について説明します。
  • メディアプレーヤーで作られたwplファイルを扱うために、UTF8からShiftJISに変換する必要があります。
  • 現在のソースコードではUTF8からShiftJISに変換する処理が行われていますが、正しく変換されていないようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.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);  } }

psychang
質問者

お礼

分かりやすい説明と完全に動くソースコードまで、ありがとうございました! うまく行きました。 (メディアプレイヤーのパラメータに、大量のファイルのフルパスを一個一個与えて再生しようとすると、全然再生されない(遅い?)ようです。パラメータの長さに限りがあるのでしょうか?) (一度、プレイリスト(m3u)ファイルに出力して、そのファイルのフルパスをメディアプレイヤーのパラメータに与えると、早く処理されるようです。) では、締め切らせていただきますね。m(_ _)m

psychang
質問者

補足

凄いです!こんなにスマートにかけるなんて、ご回答ありがとうございました m(_ _)m 後は、もう少し検証してから(土曜日あたりに)締め切らせてもらいます。 エクセルの方でも、バイナリ形式で処理するサンプルがありますので、そこら変ももう一度見てみます。 今回は全てコーディングしてもらいましたが、VC初心者を免罪符にしないようにしたいですが、正直、難しいです。。。(ΘoΘ;) では。

その他の回答 (2)

回答No.2

下記の回答は誤りです。申し訳ありません。 -------------------- UTF8->ShiftJISは、 WideCharToMultiByte(CP_UTF8, .....); で、UNICODEを経由しなくても、1回で変換できると思います。 第1引数をCP_UTF8にしてください。

psychang
質問者

お礼

解決への きっかけ を作っていただき、感謝しています。

psychang
質問者

補足

回答ありがとうございます。 誤り、分かりました。 今は、心が折れて(?)しまったので、水曜日以降、もうちょっと試行錯誤してみようと思います。 極力、コード表とにらめっこでコーディングする事をさけ(←バグを排除するためにです)、VCに用意された命令で、実現したいです。 でも検索したら、文字コードを変換するフリーソフトが沢山ヒットしました。 簡単に作れるなら、それらのツールは不要なわけで・・・と、ここで質問した事との矛盾は感じています。(だから、しばらく回答が0だったのかも知れませんねυ) 質問にあるとおり、 http://www.sutosoft.com/oldroom/devdiary/20020504.html から、コードをコピーしたら、引数の所で、型が合わないというエラーがでたので、型だけ無理やりあわせました。 (つじつま合わせの型変換は意味ないのでしょうか?) 値渡しか、参照渡しか、の意味は分かりますが、正確な表記方法は分からないかもしれません。 ちなみに、言い忘れましたが、プロジェクトの設定は、ちゃんとユニコード対応にしています。 どなたからヒントだけでもいいので、教えていただけると嬉しいです。 ではでは。

回答No.1

UTF8->ShiftJISは、 WideCharToMultiByte(CP_UTF8, .....); で、UNICODEを経由しなくても、1回で変換できると思います。 第1引数をCP_UTF8にしてください。