如何更改控制台字体?

时间:2010-07-11 07:19:11

标签: c++ unicode windows-xp console codepages

我在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)消失了。我怎样才能把系统包括在内?

1 个答案:

答案 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的默认字体。它按预期工作。

请注意,它只接受等宽字体。