質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

869閲覧

C++ MFCでの韓国語のダイアログの文字化けを解消したい。

eaglenest2005

総合スコア1

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2023/08/15 00:47

実現したいこと

C++ MFCでの韓国語のダイアログの文字化けを解消したい。

前提

Visual Studio2008 C++ MFCで32ビットアプリの開発を行っています。
今回アプリを韓国語に対応させた所、ダイアログ上の文言が?に文字化けします。
対処方法はないでしょうか?

前提 本体プロジェクトの文字セットはマルチバイト、韓国語リソースのプロジェクトを文字セットunicodeで追加した。フォント"Malgun Gothic"もインストールされている。

リソースファイル.rcの冒頭部分の記述
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#endif //_WIN32

ダイアログの定義部分
IDD_CONFIG_XXX DIALOGEX 0, 0, 346, 340
STYLE DS_SETFONT | WS_CHILD | WS_CAPTION
FONT 8, "Malgun Gothic", 400, 0, 0x1
CAPTION "스프레이콘 설정"
BEGIN

GROUPBOX "스프레이콘 설정",IDC_STATIC_GROUP_NAME,2,2,341,128
END

文字列定義部分
STRINGTABLE
BEGIN

IDS_STATIC_GROUP_NAME L"스프레이콘 설정"
END

.rc2の記述

BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041204b0" // 言語ID 0x412(韓国語)、文字コード 0x04b0 (1200) unicode
BEGIN

END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x412, 1200
END
END

エラーメッセージの表示は以下のように表示文字列を従来のCStringからCStringWに変更してAfxMessageBox()⇒MessageBoxW()に変更することで
韓国語のメッセージを正しく表示することができた。

CStringW csErrMsgW(L"");

if(! csErrMsgW.LoadString(IDS_STRING10226)){
csErrMsgW = _T("新規作成の前に保存しますか?");
}
//ret = AfxMessageBox(csErrMsg, MB_YESNOCANCEL | MB_ICONQUESTION);
ret = MessageBoxW(NULL, csErrMsgW, L"タイトル", MB_YESNOCANCEL | MB_ICONQUESTION);

一方ダイアログの表示ではそのままでは文字化けしてしまう為、ダイアログのOnInitDialog()にて以下のように記述したところ、デバッグ実行するとLoadStringで文字列は正しく取得されており、SetDlgItemTextW()の戻り値も正常でしたが、ダイアログ上の表示は????などと文字化けしています。

// リソースから文字列をロードしてCStringWに格納
CStringW csText;
csText.LoadString(IDS_STATIC_GROUP_NAME);

SetDlgItemTextW(m_hWnd, IDC_STATIC_GROUP_NAME, csText);

尚、SetDlgItemTextW()の代わりにSetWindowTextW()を用いて

HWND hWnd = m_groupBox.GetSafeHwnd();
BOOL ret = SetWindowTextW(hWnd, csText);


ダイアログのヘッダファイルの記述
// グループボックスのコントロール変数
CButton m_groupBox;

ダイアログのDoDataExchangeの記述
void ConfigXXX::DoDataExchange(CDataExchange* pDX)
{

// IDC_STATIC_GROUP_NAMEに対応する変数と関連付け
DDX_Control(pDX, IDC_STATIC_GROUP_NAME, m_groupBox);
}

と変更するとSetWindowTextW()の戻り値も正常でしたが現象は変わらずでした。
良い対処方法が有れば教えて下さい。

尚、本体プロジェクトの文字セットをunicodeにする対処は本体プロジェクトの記述がunicodeを意識した記述になっていないことで、ビルドエラーが大量に出て対処が大変な為一番最後の手段にしたいと思っています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eaglenest2005

2023/08/15 23:14

MFC C++でのプログラミングで韓国語の文字化けが発生しており困っております。文字化けを解消したです。
guest

回答1

0

自己解決

回答が付かないようなので一旦閉じたいと思います。

投稿2023/08/18 10:53

eaglenest2005

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eaglenest2005

2023/08/18 15:07

管理用の言語の設定の形式タブで韓国語を選び、管理タブのシステムロケールの設定でも韓国語を選ぶと文字化けせず表示されるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問