none
Visual Studio2017のデフォルトのWindowsプロジェクトを実行するとウィンドウのメニューの日本語が文字化けしてしまいます。

    質問

  • OSは、Windows10でVisual Studio 2017のVisual C++のWindowsデスクトップアプリケーションを新規作成してデフォルトのままビルド実行させるとメニュータイトル(ファイル、ヘルプ等)の日本語の部分が文字化けしてしまいます。単純な設定の問題だと思うのですが解決方が分からず苦慮しています。プロジェクトのプロパティーで文字セットをUnicodeからマルチバイトに変えてもダメでした。

    また、その後のプログラムでウィンドウ内にリテラルで日本語(”テスト”等)をいれると文字の内容によってビルドがエラーになる事があります。おそらく、これもデフォルトの文字化けが解消できれば解決しそうに思っております。<-実際にはこちらの方を解決したい

    解決方法分かりませんでしょうか。

    追記:メニューの文字は、リソースビューでオブジェクトのプロパティを変更してやると日本語が正常に入りますが、リソースファイル(.rc)をコード表示させてファイルの内容を編集する場合には文字化けとなります。メニュー表示部分だけの問題であればこれで解決なのですが、その後のプログラムで日本語出力がうまくいかずすべて英語表現にしてだましだまし進めており何とかできないかと考えています。



    • 編集済み Sazareshi 2018年6月23日 1:16
    2018年6月23日 0:49

回答

  • Windows 10とVisual Studioのバージョンはできるかぎり詳しく記述するようにしてください。バージョンによってはバグがあることがあります。

    例:Windows 10 バージョン1803、Visual Studio 2017 バージョン15.7.4など

    Visual Studio 2017 15.7 リリース ノート | Microsoft Docs

    まず、リソーススクリプト(*.rcファイル)とリソースヘッダー(resource.h)をコードエディターで開き、メニューの[ファイル]→[保存オプションの詳細設定]にて、[Unicode - コードページ 1200]に設定されているかどうか確認してみてください。

    また、リソーススクリプト内に、LANGUAGEで始まるステートメントが存在するはずです。

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE 17, 1

    もし上記の記述が存在しない場合、あるいは記述内容が異なる場合、それが原因で文字化けしている可能性があります。VC2017の特定のバージョンには、プロジェクトテンプレートやリソースエディターのバグがあるらしく、不正なコードが生成されてしまうようです。

    RC2135 file not found after edit resource. - Developer Community

    Visual C++ generated resource script has localized error. - Developer Community

    暫定回避方法としてリソーススクリプトの該当行を手動で修正するか、あるいはVS2017の利用はあきらめてVS2015 Update3などの安定している過去バージョンを使う方法もあります。

    なお、Visual C++の文字列リテラル "..." は、既定でANSIマルチバイトエンコーディング(日本語環境ではCP932、Shift_JIS)として解釈されます。ワイド文字列リテラル L"..." はUTF-16として解釈されます。Win32 APIで関数や構造体のインターフェイスに使われているTCHARLPTSTRおよびLPCTSTRは、プロジェクト設定をUnicode文字セットにすると、それぞれWCHARLPWSTRおよびLPCWSTRになります。プロジェクト設定に応じてリテラルを切り替えることのできるTEXT()マクロおよび_T()マクロが用意されています。

    // 適合コード。
    MessageBox(nullptr, TEXT("テキスト"), TEXT("キャプション"), MB_OK);
    // Unicode 文字セット設定の場合、プリプロセッサによって以下のように展開されます。
    MessageBoxW(nullptr, L"テキスト", L"キャプション", MB_OK);
    // マルチバイト文字セット設定の場合、プリプロセッサによって以下のように展開されます。
    MessageBoxA(nullptr, "テキスト", "キャプション", MB_OK);

    Visual C++ 2017の「Windows デスクトップ ウィザード」が生成するテンプレートでは、ワイド文字列版のWin32 APIが最初から使用されているはずです。ワイド文字列版のAPIを使う場合、文字列リテラルにはLプレフィックスを付けたワイド文字列を使用します。

    なお、本来は日本語Windows、日本語Visual Studioの標準的な環境であれば、プロジェクト設定がUnicode文字セットであってもマルチバイト文字セット(MBCS)であっても、またリソーススクリプトのテキストエンコーディングがCP1200 (UTF-16LE) であってもCP932 (Shift_JIS) であっても問題なくビルド&実行できるはずです。ただし、現在は国際化対応に有利なUnicodeのほうが推奨されています。

     

    ちなみに問題が解決していないのに回答マークを付けてしまうと、すでに問題が解決したものとみなされて以後回答が集まらなくなる可能性が高くなってしまうと思われます。

    • 編集済み sygh 2018年6月23日 19:38
    • 回答としてマーク Sazareshi 2018年6月25日 22:08
    2018年6月23日 17:32

すべての返信

  • 当てずっぽうですが、コントロールパネルの地域のこの設定が日本語になっていないということはないでしょうか?

    

    • 回答としてマーク Sazareshi 2018年6月23日 5:18
    • 回答としてマークされていない Sazareshi 2018年6月23日 5:18
    • 回答としてマーク Sazareshi 2018年6月23日 5:23
    • 回答としてマークされていない Sazareshi 2018年6月25日 10:28
    2018年6月23日 1:15
  • マルチポストのようですので他のポスト先の URL を張っておきます。

    https://teratail.com/questions/132548

    質問者さんへ>

    マルチポストの意味が分からなければ、それをキーワードにググってヒットする記事を読んでください。いろいろ意見はあるようですが、まず歓迎されることはありません。このフォーラムでは管理者の方から遠慮いただくようにと案内が出ています。


    • 編集済み SurferOnWww 2018年6月23日 1:43 誤字訂正
    2018年6月23日 1:42
  • ご指導頂き、感謝いたします。こういったサイトに質問を投稿する事が初めてでしたので、どのサイトを利用するのが良いか見ようと思い2か所に投稿してしまいました。コメントいただいたおかげで、1度の失敗で済みました。ありがとうございました。
    • 回答としてマーク Sazareshi 2018年6月23日 5:19
    • 回答としてマークされていない Sazareshi 2018年6月23日 5:19
    2018年6月23日 4:44
  • コメント頂きありがとうございます!ご指摘の設定確認してみましたが、日本語になっていました。

    引き続き、自分でも他の開発環境と見比べてみたりして確認してみようと思います。もし、また何か思いつくような事がありましたら、よろしくお願いいたします。

    • 回答としてマーク Sazareshi 2018年6月23日 5:19
    • 回答としてマークされていない Sazareshi 2018年6月23日 5:19
    2018年6月23日 4:55
  • Windows 10とVisual Studioのバージョンはできるかぎり詳しく記述するようにしてください。バージョンによってはバグがあることがあります。

    例:Windows 10 バージョン1803、Visual Studio 2017 バージョン15.7.4など

    Visual Studio 2017 15.7 リリース ノート | Microsoft Docs

    まず、リソーススクリプト(*.rcファイル)とリソースヘッダー(resource.h)をコードエディターで開き、メニューの[ファイル]→[保存オプションの詳細設定]にて、[Unicode - コードページ 1200]に設定されているかどうか確認してみてください。

    また、リソーススクリプト内に、LANGUAGEで始まるステートメントが存在するはずです。

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE 17, 1

    もし上記の記述が存在しない場合、あるいは記述内容が異なる場合、それが原因で文字化けしている可能性があります。VC2017の特定のバージョンには、プロジェクトテンプレートやリソースエディターのバグがあるらしく、不正なコードが生成されてしまうようです。

    RC2135 file not found after edit resource. - Developer Community

    Visual C++ generated resource script has localized error. - Developer Community

    暫定回避方法としてリソーススクリプトの該当行を手動で修正するか、あるいはVS2017の利用はあきらめてVS2015 Update3などの安定している過去バージョンを使う方法もあります。

    なお、Visual C++の文字列リテラル "..." は、既定でANSIマルチバイトエンコーディング(日本語環境ではCP932、Shift_JIS)として解釈されます。ワイド文字列リテラル L"..." はUTF-16として解釈されます。Win32 APIで関数や構造体のインターフェイスに使われているTCHARLPTSTRおよびLPCTSTRは、プロジェクト設定をUnicode文字セットにすると、それぞれWCHARLPWSTRおよびLPCWSTRになります。プロジェクト設定に応じてリテラルを切り替えることのできるTEXT()マクロおよび_T()マクロが用意されています。

    // 適合コード。
    MessageBox(nullptr, TEXT("テキスト"), TEXT("キャプション"), MB_OK);
    // Unicode 文字セット設定の場合、プリプロセッサによって以下のように展開されます。
    MessageBoxW(nullptr, L"テキスト", L"キャプション", MB_OK);
    // マルチバイト文字セット設定の場合、プリプロセッサによって以下のように展開されます。
    MessageBoxA(nullptr, "テキスト", "キャプション", MB_OK);

    Visual C++ 2017の「Windows デスクトップ ウィザード」が生成するテンプレートでは、ワイド文字列版のWin32 APIが最初から使用されているはずです。ワイド文字列版のAPIを使う場合、文字列リテラルにはLプレフィックスを付けたワイド文字列を使用します。

    なお、本来は日本語Windows、日本語Visual Studioの標準的な環境であれば、プロジェクト設定がUnicode文字セットであってもマルチバイト文字セット(MBCS)であっても、またリソーススクリプトのテキストエンコーディングがCP1200 (UTF-16LE) であってもCP932 (Shift_JIS) であっても問題なくビルド&実行できるはずです。ただし、現在は国際化対応に有利なUnicodeのほうが推奨されています。

     

    ちなみに問題が解決していないのに回答マークを付けてしまうと、すでに問題が解決したものとみなされて以後回答が集まらなくなる可能性が高くなってしまうと思われます。

    • 編集済み sygh 2018年6月23日 19:38
    • 回答としてマーク Sazareshi 2018年6月25日 22:08
    2018年6月23日 17:32
  • sygh様

    大変ありがとうございました。リソーススクリプト(*.rcファイル)を[Unicode - コードページ 1200]で保存し直す事で解決致しました。とても助かりました。にわかプログラマで、わからない事多くありますが、ひとつひとつ学んでいきたいと思います。

    ちなみに、バージョンに関しては、Windows10 Pro 1703, Visual Studio professional 2017 15.3.5でした。

    あと、同様の状況で元から問題のなかった他の人のバージョンは、Window10 Home 1803で、 Visual Studio Community 2017 15.5.3 と Window10 Home 1803、 Visual Studio Community 2017 15.2(26430.16)でした。

    無事、解決できましたので今度こそ回答としてマークさせていただきます。

    ありがとうございました。

    2018年6月25日 22:08
  • リソーススクリプトのコードページを変更して保存することで、ひとまず解決できたとのことでなによりです。リソースヘッダー (resource.h) もCP1200で保存しておくことをお勧めします。

    ちなみに参考までに教えていただきたいのですが、問題の発生しているVS2017 v15.3.5でプロジェクトを新規作成したときに、*.rcファイルの既定のコードページ番号は、[保存オプションの詳細設定]ダイアログのドロップダウンリストでは何であると表示されますか?

    少なくともVS2015 Update3のプロジェクトテンプレートが生成するリソーススクリプトとリソースヘッダーでは最初からCP1200になっていますが、以下の報告事例によるとVS2017 v15.3.0のプロジェクトテンプレートにはバグがあって、リソーススクリプトファイルが不適切なコードページ (おそらくCP65001, UTF-8) となってしまうようです。実はリソーススクリプトを処理するリソースコンパイラ (rc.exe) はANSIマルチバイトもしくはUTF-16のみをサポートしています。

    VS Community 2017 15.3.0 after you upgrade a Win32 C++ project templates in Japan to disguise oneself as a - Developer Community

    新しいバージョンのVisual Studio 2017では修正されているとあるので、恒久策としてはVS2017のバージョンを上げたいところですが、残念ながら前述のように現在の最新版v15.7.4には別の不具合があるようです。また、もしチーム開発する場合は、Visual Studioのバージョンは全員揃えることを推奨します。

     

    なお、マルチポストしていた別サイトのほうに経過報告する際も、詳しいバージョン情報などを併せて記載しておいてください。コミュニティサイトでは、適切な情報を提供することで、回答者だけでなく質問者もコミュニティに貢献することができます。

    • 編集済み sygh 2018年6月26日 14:42 参考URLをハイパーリンク化。
    2018年6月26日 1:33
  • なお、本来は日本語Windows、日本語Visual Studioの標準的な環境であれば、プロジェクト設定がUnicode文字セットであってもマルチバイト文字セット(MBCS)であっても、またリソーススクリプトのテキストエンコーディングがCP1200 (UTF-16LE) であってもCP932 (Shift_JIS) であっても問題なくビルド&実行できるはずです。
    非Unicodeの文字列をどう解釈するかは、先の私の回答で提示した設定を参照します。ここが日本語になっていれば CP932(Shift_JIS) と解釈されます。
    # 例えば私は英語版Windowsを使用していますが、この設定により正しくShift_JISと解釈されています。
    2018年6月26日 2:06
  • 既定のコードページは、記述頂いた内容にあるように”Unicode(UTF-8シグネチャなし)-コードページ65001”となっていました。

    お見事です。としか言えません。時間を割いて頂き情報を頂くばかりで少し心苦しく思うところありましたが、こちらも情報を細かく記述することで多少なりとも貢献できると伺い、少し気が楽になりました。別サイトの方の情報も更新しておきます。

    ありがとうございました。

    2018年6月26日 4:48
  • 引き続きのフォロー頂き感謝です。問題に直面した際に自分のバグだけでなく、元のシステム側のバグの可能性も考える選択肢がある事、勉強になりました。今回、こちらに質問を投稿するまでにかなり時間を費やしてあれこれ悩みましたが、次に同様な状況が起こったときは、今回よりはもう少し早く解決の糸口を見つけることができそうです。

    もし、また機会がありましたらご指導お願いいたします。

    2018年6月26日 4:52