2016-04-10 30 views
1

C++でのWinAPIプログラミングが比較的新しいです。私は、GetComputerName()を使用してシステムのホスト名を取得するプログラムを作成しようとしています。理想的には、英語と英語以外のシステムでコードを動作させたいと思っています。GetComputerName()がWindowsコンソールでUnicodeを正しく表示しない

int main() 
{ 
    wstring hostname; 
    wchar_t nbtName[MAX_COMPUTERNAME_LENGTH + 1]; 
    DWORD length = MAX_COMPUTERNAME_LENGTH + 1; 
    GetComputerName(nbtName, &length); 
    hostname = nbtName; 

    wcout << hostname << endl; 

    return 0; 
} 

コードは、私の英語のWindows 7システム上で正常に動作しますが、コードはドイツ文字を使用する(私のドイツ語のWindows 7システム上で正しく表示されていないようです。以下は、私が使用しているコードがありますホスト名)。私はwstringとwchar_tがこれらの特殊文字を扱うことができると思った。ドイツのWindows 7システムに表示される内容は次のとおりです。

COMPUTER-Í─▄▀ 

私は何か愚かなものを見落としていますか?ありがとう!

+0

名前をコンソールにコピー&ペーストできますか?おそらくコンソールは、必要なコードポイントに対して異なるグリフを持つフォントを使用しています。 – enhzflep

+0

Windowsの "hostname"コマンドを使用すると、ドイツ語の文字が正しく表示されます。 – t3ntman

答えて

3

使用_setmode(_fileno(stdout), _O_U16TEXT)コンソールウィンドウにUnicodeを表示する:

#include <iostream> 
#include <string> 
#include <io.h> //for _setmode 
#include <fcntl.h> //for _O_U16TEXT 

int main() 
{ 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    std::wcout << L"ελληνικά\n"; 
    return 0; 
} 

またはUnicodeテキストが正しく表示され見ることがMessageBoxW(0, hostname.c_str(), 0, 0)またはOutputDebugStringWを使用します。

1

この関数には、ユニコードの場合はGetComputerNameW、ANSIの場合はGetComputerNameAの2つのバージョンがあります。 UNICODEが環境内で定義されている場合は、最初のUNICODEが呼び出されます。したがって、UNICODEが定義されていることを確認するか、GetComputerNameWを直接呼び出そうとしてください。

+0

ユニコードは私のプロジェクトで定義されています。私はGetComputerName()の代わりにGetComputerNameW()関数を試しましたが、問題はまだ同じです。 – t3ntman

+0

@ t3ntmanあなたの問題は、あなたのコンソール出力がUnicode文字を正しく表示していないことです。それについての議論があります(http://stackoverflow.com/questions/28216113/unicode-output-on-windows-console?rq=1) –

+0

私はそれを調べますが、私はそれが"hostname"のようなネイティブWindows実行ファイルは正しいホスト名を表示しますが、私のプログラムは表示しません。 – t3ntman

0

Windowsコンソール出力が犯人でした。コンソール以外の出力では、Unicode文字が正しく表示されます。みんな、ありがとう!

関連する問題