我在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'没有该字母的字体。 所以,我下载了一些其他字体,可以渲染გcorrecly,但我无法更改(Visual Studio 2005项目)控制台字体。
我更改了HKEY_CURRENT_USER \ Console \%SystemRoot%_system32_cmd.exe \ FontName,但是当我检查Prompt的属性时 - >字体,它设置为'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); // http://stackoverflow.com/questions/1922294/using-unicode-font-in-c-console-app //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:BTW,当我把“include< fcntl.h>”在“代码标记”中,包含在<>中的部分(fcntl.h)消失了。我怎样才能把系统包括在内?
答案 0 :(得分:2)
在此处通过Google找到这些说明:
http://keznews.com/3308_Adding_fonts_to_cmd_exe
默认情况下,a上的属性 cmd.exe窗口允许您选择 光栅字体或Lucida控制台。 您可以添加其他等宽字体 通过注册表列表。
在注册表中,导航至
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ Console\TrueTypeFont
请注意,Lucida Console已经存在 在此键下,名称为“0”。
使用名称添加新的sting值 “00”(是的,这是必需的名字) 并将数据设置为a的名称 monospace字体已安装在 你的C:\ Windows \ Fonts文件夹。在这 例如,我添加了Consolas字体。它 似乎需要额外的条目 名称“000”,“0000”等。名称如 “1”和“2”不起作用。对于皮特来说 为什么?
打开一个新的cmd窗口,右键单击 在系统菜单上,选择属性 |字体和新添加的 字体。
我这样做是因为我想要更多 我的PowerShell的可读字体 窗口,因为我已经花了一些钱 时间盯着它。
来源:ferncrk.com
我按照说明操作,将Consolas作为cmd的默认字体。它按预期工作。
请注意,它只接受等宽字体。