none
ダイアログの文字化けについて

    質問

  • VC++2008,MFC,MBCS(日本語使用)で作成したアプリケーションがあります。

    Windows10(デフォルト言語:タイ語→表示言語を日本語に変更)にインストールして起動したところ

    ダイアログの文字列が「????」で表示されました。

    原因は、Unicode対応ではないプログラムの言語」の値が、「タイ語」だった為で、「日本語(日本)」に変更したところ
    ダイアログ文字列の文字化けは解消されました。

    ただ疑問があり、Unicode対応ではないプログラムの言語」の値が、「タイ語」のとき、

    メニュー(タイトルバーの下に表示されるもの)の文字列は、日本語にも関わらず、文字化けはおこっていませんでした。

    同じリソースからの表示なのに、メニューの文字列は文字化けせず、ダイアログの文字列が文字化けしなかったのが疑問です。

    教えてください。

    2018年7月12日 1:47

回答

  • プロジェクトの設定で、Unicode ではない設定としてあっても、リソースの文字列を Unicode 文字列として扱うことは可能です。

    例えば、LoadStringW 関数を使えば Unicode 文字列としてリソースの String Table から文字列を取り出せます。

    内部の処理は分かりかねますが、メニューの作成及び描画では、メニューの項目を Unicode 文字列として正しく扱っているのだと思われます。

    タイトルバーの文字列に関しては、ウィンドウが RegisterClassW 関数で登録され、既定のウィンドウプロシージャが DefWindowProcW 関数で処理されるようにする条件で、SetWindowTextW 関数でタイトルバーの文字を文字化けせずに設定できました。

    • 回答としてマーク Brillia 2018年7月19日 0:44
    2018年7月12日 2:47

すべての返信

  • プロジェクトの設定で、Unicode ではない設定としてあっても、リソースの文字列を Unicode 文字列として扱うことは可能です。

    例えば、LoadStringW 関数を使えば Unicode 文字列としてリソースの String Table から文字列を取り出せます。

    内部の処理は分かりかねますが、メニューの作成及び描画では、メニューの項目を Unicode 文字列として正しく扱っているのだと思われます。

    タイトルバーの文字列に関しては、ウィンドウが RegisterClassW 関数で登録され、既定のウィンドウプロシージャが DefWindowProcW 関数で処理されるようにする条件で、SetWindowTextW 関数でタイトルバーの文字を文字化けせずに設定できました。

    • 回答としてマーク Brillia 2018年7月19日 0:44
    2018年7月12日 2:47
  • VC++2008,MFC,MBCS(日本語使用)で作成したアプリケーションがあります。
    MBCSはコンパイル時ではなく、実行時のコードページで動作が決定されます。この値こそが「Unicode対応ではないプログラムの言語」の設定となります。
    2018年7月12日 3:39