none
ユニコードビルド(_UNICODE)時の書式化に関して RRS feed

  • 質問

  • 現在、VC++2005にて、MFCを利用したアプリケーションを マルチバイト文字セット → ユニコード文字セット(_UNICODE)に移植しております。

    そのアプリケーションの中で、CStdioFile::WriteString()を呼んだところ、全角文字が出力されないという問題に遭遇しました。その問題は有名なようで、ネットサーフィンの結果、すぐに解決方法が見つかりました。
    その解決方法というのが、アプリケーションの初期化時に setlocale(LC_CTYPE , "") を実行することでした。
    これで、当初の問題は解決したのですが、

    以下のようなコードを実行したときに、
      CString strTest;
      strTest.Format(_T("%10s"), _T("あいう"));
    以下のようにstrTestに格納されます。
      [       あいう] ← 全角文字も1文字と数えて10文字幅

    既存のソースコードが、
      [    あいう] ← 全角文字は2文字と数えて10文字幅
    を期待しているので、修正したいのですが、自分で文字数を数えてバリバリとハードコーディングするしかないのでしょうか?

    2009年11月18日 0:25

回答

  • ふるかわさん

    ありがとうございました。
    とても良いヒントになりました。
      setlocale(LC_CTYPE , "");
    だと、他にもいろいろ影響がありそうなのでやめることにしました。

    代わりに、例えば、以下のコードを
      CString strTest = _T("あいう");
      CStdioFile File(~);
      File.WriteString(strTest);
    以下のように置き換えることにより、
      CString strTest = _T("あいう");
      CStdioFile File(~);
      CStringA strTestA = (CT2A)strTest;
      File.Write(strTest, strTest.GetLength());
    うまくいきました。

    これでいきたいと思います。

    • 回答としてマーク ぶなっぷ 2009年11月18日 1:51
    2009年11月18日 1:50

すべての返信

  • 例えば、こんな感じで(日本語オンリーになっちゃいますけど)。

    CStringA strTestA;
    strTestA.Format("%10s", "あいう");
    CString strTest = strTestA;
    2009年11月18日 1:09
  • ふるかわさん

    ありがとうございました。
    とても良いヒントになりました。
      setlocale(LC_CTYPE , "");
    だと、他にもいろいろ影響がありそうなのでやめることにしました。

    代わりに、例えば、以下のコードを
      CString strTest = _T("あいう");
      CStdioFile File(~);
      File.WriteString(strTest);
    以下のように置き換えることにより、
      CString strTest = _T("あいう");
      CStdioFile File(~);
      CStringA strTestA = (CT2A)strTest;
      File.Write(strTest, strTest.GetLength());
    うまくいきました。

    これでいきたいと思います。

    • 回答としてマーク ぶなっぷ 2009年11月18日 1:51
    2009年11月18日 1:50