2016-10-06 33 views
0

WinApiのWriteConsoleOutputを使用して、コマンドプロンプトウィンドウバッファに文字を書き込もうとしています。実際には、などの文字を、'\uFFFF''0xFF'のようなエンコード/表記を使用する代わりに、ソースコードに直接書くことができるようにしたいと思います(コードページ/文字セットなどの違い)ソースコードからWriteConsoleOutputに直接Unicode(?)文字を書き込む

以下のコードは、私の問題の最も単純な形式を示しています。このコードを実行すると、コマンドプロンプトウィンドウにが出力されませんが、疑問符(?)が表示されます。

#include <Windows.h> 

int main() 
{ 
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
    CHAR_INFO c[1] = {0}; 
    COORD cS = {1, 1}; 
    COORD cH = {0, 0}; 
    SMALL_RECT sr = {0, 0, 0, 0}; 

    c[0].Attributes = FOREGROUND_INTENSITY; 
    c[0].Char.UnicodeChar = '☺'; 
    WriteConsoleOutput(h, c, cS, cH, &sr); 
    Sleep(5000); 
    return 0; 
} 

私のコードに関係なく使用/インストールされている言語の、すべてのWindowsのバージョン間で同一の出力を表示することが不可欠です。私の知る限りでは(確かに最小限です)、特定のコードページを設定する必要があります(Windowsの任意の言語でコマンドプロンプトでサポートされることを望みます)。

私が試した:SetConsoleCPSetConsoleOutputCP機能と周りいじる•CHAR_INFO.UnicodeCharを使用してからCHAR_INFO.AsciiChar
に変更•
を、私はこの問題で私を助けるためにそれらを活用する方法についての手掛かりを持っていません。
Visual Studioの変更 - >プロジェクト - >プロジェクトのプロパティ.. - >文字セット可能なすべての値に設定します。
上記の設定に加えて、WriteConsoleOutputAまたはWriteConsoleOutputWのいずれかを特に使用します。
ソースコードファイルのエンコーディングを(/ out)シグネチャでUTF-8に変更します。私のプロジェクトで


私はプログラム的に私の知る限り、実際のUnicode文字をサポートしていない、8×8の端末にコマンドプロンプトのフォントを設定しています。利用可能な文字はhereと表示されます。これらの文字には '☺'が含まれているので、私の質問はユニコードに関するものではないと私は完全には考えていません。私はもう考えていない。助けてください。

+2

c [0] .Char.UnicodeChar = L'☺ 'を使用する必要があります。コンパイラがあなたのソースコードを理解していることを確認して、「ファイル」>「高度な保存オプション」>「Unicode(UTF-8 with signature) - Codepage 65001」を選択します。現在発行されているBOMは、ソースコードがutf8でエンコードされていることをコンパイラに知らせるのに十分です。 –

+0

@ hans-passantこれは、私に笑顔の代わりに ':'(コロン)を与えます。エンコーディングをUTF-8として保存しても。 – user6003859

+1

文字はU + 263A、3A == ':'です。Lは重要です。 –

答えて

1

ソースはasciiのみでなければなりません。 CソースファイルにASCII以外の文字を埋め込んだ場合、IDEは正しい形式で表示されるかもしれませんが、コンパイラはそれらを別々に処理する可能性が高くなります。ポータブルでも信頼できるものでもありません。しかし、エスケープシーケンス\ xを使って、Cの文字列に任意のバイトを埋め込むことができます。

UTF-8は内部使用には適していますが、Windows APIはそれをまだサポートしていないため、拡張文字を表示するにはWindows 16ビット文字(UTF-16はほぼそうではありません)に変換する必要があります。ただし、ワイド文字版のWindows APIを呼び出す必要があります。文字列を受け取るほとんどのWindows API関数は、バイナリの下位互換性のためにAとWバージョン(ASCIIとワイド)で提供されます。 IDEで識別子を照会すると(定義などに行きます)、あなたはどのバージョンを持っているかを確認する必要があります。

関連する問題