У меня проблема с выводом Unicode в консоли Windows XP.(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, но когда я проверяю свойства подсказки -> Шрифт, он устанавливается как «Lucida Console». Есть ли способ изменить шрифт консоли с помощью API?
Следующий код - это то, что я пробовал. Но он не работает. Справка.
#include "stdafx.h"
#include "Windows.h"
#include
using namespace std;
// Conventional wisdom is retarded, aka What the @#%&* is _O_U16TEXT?
// http://www.siao2.com/2008/03/18/8306597.aspx
int main() {
locale::global(locale(""));
// Windows Command Prompt use code page 850,
// probably for backwards compatibility with old DOS programs.
// Unicode at the Windows command prompt (C++; .Net; Java)
// http://illegalargumentexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html
// INFO: SetConsoleOutputCP Only Effective with Unicode Fonts
// http://support.microsoft.com/kb/99795
// Undocumented 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 is known to identify Lucida Console (a Unicode font)
BOOL bRet = SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), fontIndex);
// /1037060/ispolzovanie-shrifta-unicode-v-konsolnom-prilozhenii-c
//const UINT codePage = CP_UTF8; //
const UINT codePage = 1200; // 1200(utf-16 Unicode)
SetConsoleOutputCP(codePage);
wchar_t s[] = L"èéøÞǽлљΣæča\n";
int bufferSize = WideCharToMultiByte(codePage, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize];
WideCharToMultiByte(codePage, 0, s, -1, m, bufferSize, NULL, NULL);
// 0x00000459 "No mapping for the Unicode character exists in the target multi-byte code page."
wprintf(L"%S", m); // it doesn't work
wprintf(L"%s", s); // it work a bit
// after L'Ⴂ' letter, wcout failed!
wcout
PS: Кстати, когда я помещаю «include » в «тег кода»,часть с in <> (fcntl.h) исчезла. Как я могу указать включение системы?