4

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) が消えてしまいました。システムインクルードをどのように配置できますか?

4

1 に答える 1

2

Google でこれらの手順を見つけました:
http://keznews.com/3308_Adding_fonts_to_cmd_exe

デフォルトでは、cmd.exe ウィンドウのプロパティで、ラスター フォントまたは Lucida コンソールのいずれかを選択できます。レジストリを使用して、他のモノスペース フォントをリストに追加できます。

regedit で、次の場所に移動します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ Console\TrueTypeFont

Lucida Console は、既にこのキーの下に "0" という名前であることに注意してください。

「00」という名前の新しい文字列値を追加し (はい、これが必要な名前です)、C:\Windows\Fonts フォルダーに既にインストールされているモノスペース フォントの名前にデータを設定します。この例では、Consolas フォントを追加しました。追加のエントリには「000」、「0000」などの名前が必要なようです。「1」や「2」などの名前は機能しません。ピートのために、なぜ?

新しいコマンド ウィンドウを開き、システム メニューを右クリックして、[プロパティ] | [プロパティ] を選択します。フォントと、新しく追加されたフォントがあります。

これを行ったのは、PowerShell ウィンドウをじっと見つめていたので、もっと読みやすいフォントが必要だったからです。

ソース: ferncrk.com

指示に従い、Consolas を cmd のデフォルト フォントにしました。期待どおりに機能しました。

等幅フォントのみを受け入れることに注意してください。

于 2010-07-11T09:12:12.007 に答える