ウィンドウアプリケーションで外国語などを表示したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マモ

ウィンドウアプリケーションで外国語などを表示したい

#1

投稿記事 by マモ » 10年前

現在VC++2010でウィンドウアプリケーションを作成しています。
コマンドライン引数から文字列を与え、文字を画面に表示する(エクスプローラの右クリック、プログラムから開く)ことを目的としています。
TEXTOUTを使用して、日本語や一部記号を入力して表示することはできるのですが、外国語などでは文字化けが起きてしまいます。
読み込んだ文字列(■が文字化け):あ♥处→あ♥■
プロジェクトの設定や使う変数はUnicodeに対応したものにしてありますし、読み込んだ文字列を調べると値が3042、2665、5904となっており
入力した文字列のUTF16コードになっているのでコマンドライン引数から文字列変数に正しいデータは入っているようです。

ウィンドウに外国語文字を表示するためにはどうすればいいんでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ウィンドウアプリケーションで外国語などを表示したい

#2

投稿記事 by みけCAT » 10年前

とりあえず、明示的に表示したい外国語文字に対応したフォントに設定して試してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

Re: ウィンドウアプリケーションで外国語などを表示したい

#3

投稿記事 by naohiro19 » 10年前

setlocale(LC_ALL, "ko-KR");
これでアプリケーションのロケールが韓国語設定になります。
おそらく表示されないのはこのロケール設定ですね。

マモ

Re: ウィンドウアプリケーションで外国語などを表示したい

#4

投稿記事 by マモ » 10年前

#ifdef UNICODE
extern "C" int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPreInst,LPWSTR lpszCmdLine, int nCmdShow )
#else
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow )
#endif
{
//_tsetlocale(LC_ALL, _T(""));
_tsetlocale(LC_ALL, _T("ko-KR"));


///////中略////////
   //プロシージャ処理
       TCHAR str[] = L"あいうえお あ♥处";
          case WM_PAINT:
              hDC = GetDC(hWnd);
TextOut(hDC , 10 , 30 , (LPCTSTR)str , _tcslen(str));
break;
return 0;
}
とやってもだめですね
なおかつ特定の言語だけを表示したいわけではなく、日本語に~語が混じった状態でも表示できるようにしたいわけなんですが・・・

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: ウィンドウアプリケーションで外国語などを表示したい

#5

投稿記事 by みけCAT » 10年前

フォントを適当に指定した所、gcc (GCC) 4.8.1、Windows 7 Home Premium SP1 64ビットでは表示できました。

コード:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	TCHAR str[] = L"あいうえお あ♥处";
	static HFONT hFont;
	switch(Message) {
		case WM_CREATE: {
			hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY, DEFAULT_PITCH, L"MS ゴシック");
			break;
		}

		case WM_PAINT: {
			PAINTSTRUCT ps;
			HDC hDC = BeginPaint(hWnd, &ps);
			HFONT oldFont = SelectObject(hDC, hFont);
			TextOut(hDC , 10 , 30 , (LPCTSTR)str , lstrlen(str));
			SelectObject(hDC, oldFont);
			EndPaint(hWnd, &ps);
			break;
		}

		case WM_DESTROY: {
			DeleteObject(hFont);
			PostQuitMessage(0);
			break;
		}

		default:
			return DefWindowProc(hWnd, Message, wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc;
	HWND hwnd;
	MSG msg;

	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc;
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);

	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = L"WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wc)) {
		MessageBoxA(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowExA(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		640,
		480,
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBoxA(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	while(GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
(ソースコードはUTF-8で保存した)

実行結果
uxinndou20150629.png
実行結果
uxinndou20150629.png (19.68 KiB) 閲覧数: 2657 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る