Windows XP コンソールでの出力 Unicode に問題があります。(Microsoft Windows XP [バージョン 5.1.2600]) 最初のコードは ( http://www.siao2.com/2008/03/18/8306597.aspxより)
#include
#include
#include
int main(void) {
_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
wprintf(L"èéøÞǽлљΣæča\n");
wprintf(L"ぐႢ\n");
wprintf(L"\x3050\x10a0\n");
return 0;
}
私のコードページは 65001(CP_UTF8) です。Ⴂ を除いて、どの文字も見栄えがします。でも Ⴂ は四角に見えます。コンソールのデフォルト フォント「Lucida Console」には、その文字のフォントがありません。そのため、Ⴂ を正しくレンダリングできる他のフォントをダウンロードしましたが、(Visual Studio 2005 プロジェクトの) コンソール フォントを変更できません。
HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe\FontNameを変更したのですが、Promptのプロパティ→フォントを確認すると「Lucida Console」になっています。APIでコンソールのフォントを変更する方法はありますか?
次のコードは私が試したものです。しかし、うまくいきません。ヘルプ。
#include "stdafx.h" #include "Windows.h" #含む 名前空間 std を使用します。 // 社会通念は遅れている、別名 @#%&* は _O_U16TEXT とは? // http://www.siao2.com/2008/03/18/8306597.aspx int main() { locale::global(locale("")); // Windows コマンド プロンプトはコード ページ 850 を使用します。 // おそらく、古い DOS プログラムとの後方互換性のためです。 // Windows コマンド プロンプトでの Unicode (C++; .Net; Java) // http://illegalargumentexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html // 情報: SetConsoleOutputCP は Unicode フォントでのみ有効です // http://support.microsoft.com/kb/99795 // 文書化されていない API : SetConsoleFont // http://cboard.cprogramming.com/windows-programming/102187-console-font-size.html typedef BOOL (WINAPI *FN_SETCONSOLEFONT)(HANDLE, DWORD); FN_SETCONSOLEFONT SetConsoleFont; HMODULE hm = GetModuleHandle(_T("KERNEL32.DLL")); SetConsoleFont = (FN_SETCONSOLEFONT) GetProcAddress(hm, "SetConsoleFont"); int fontIndex = 10; // 10 は Lucida Console (Unicode フォント) を識別するために知られています BOOL bRet = SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), fontIndex); // http://stackoverflow.com/questions/1922294/using-unicode-font-in-c-console-app //const UINT codePage = CP_UTF8; /// const UINT codePage = 1200; // 1200(utf-16 ユニコード) SetConsoleOutputCP(codePage); wchar_t s[] = L"èéøÞǽлљΣæča\n"; int bufferSize = WideCharToMultiByte(codePage, 0, s, -1, NULL, 0, NULL, NULL); char* m = 新しい char[bufferSize]; WideCharToMultiByte(codePage, 0, s, -1, m, bufferSize, NULL, NULL); // 0x00000459 "対象のマルチバイト コード ページに Unicode 文字のマッピングが存在しません。" wprintf(L"%S", m); // 動作しません wprintf(L"%s", s); // 少しは動く // L'Ⴂ' レターの後、wcout が失敗しました! wcout
PS : ところで、「code タグ」に「include < fcntl.h >」を入れると、<> で囲まれた部分 (fcntl.h) が消えてしまいました。システムインクルードをどのように配置できますか?