現在VC++2010でウィンドウアプリケーションを作成しています。
コマンドライン引数から文字列を与え、文字を画面に表示する(エクスプローラの右クリック、プログラムから開く)ことを目的としています。
TEXTOUTを使用して、日本語や一部記号を入力して表示することはできるのですが、外国語などでは文字化けが起きてしまいます。
読み込んだ文字列(■が文字化け):あ♥处→あ♥■
プロジェクトの設定や使う変数はUnicodeに対応したものにしてありますし、読み込んだ文字列を調べると値が3042、2665、5904となっており
入力した文字列のUTF16コードになっているのでコマンドライン引数から文字列変数に正しいデータは入っているようです。
ウィンドウに外国語文字を表示するためにはどうすればいいんでしょうか?
ウィンドウアプリケーションで外国語などを表示したい
Re: ウィンドウアプリケーションで外国語などを表示したい
とりあえず、明示的に表示したい外国語文字に対応したフォントに設定して試してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ウィンドウアプリケーションで外国語などを表示したい
setlocale(LC_ALL, "ko-KR");
これでアプリケーションのロケールが韓国語設定になります。
おそらく表示されないのはこのロケール設定ですね。
これでアプリケーションのロケールが韓国語設定になります。
おそらく表示されないのはこのロケール設定ですね。
Re: ウィンドウアプリケーションで外国語などを表示したい
#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;
}
とやってもだめですね
なおかつ特定の言語だけを表示したいわけではなく、日本語に~語が混じった状態でも表示できるようにしたいわけなんですが・・・
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;
}
とやってもだめですね
なおかつ特定の言語だけを表示したいわけではなく、日本語に~語が混じった状態でも表示できるようにしたいわけなんですが・・・
Re: ウィンドウアプリケーションで外国語などを表示したい
フォントを適当に指定した所、gcc (GCC) 4.8.1、Windows 7 Home Premium SP1 64ビットでは表示できました。
(ソースコードはUTF-8で保存した)
実行結果
#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;
}
実行結果
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)