2013-09-07 22 views
10

cout << "привет";またはwcout << L "привет";

wcout<< L"привет"; 

はそうではない?

cout<< "привет"; 

がうまく機能する理由(Qt Creator for linux)

+1

おそらく、出力としてこれらの文字を受け取ったものは「ワイド文字を理解できません」と思われるからです。 「うまくいきません」と言えば、もう少し役立つかもしれません。 –

+0

それは?ターミナルウィンドウではなくしかし、どのように "привет"ユニコードすることができますか? – user2029077

+4

итебе "привет" – vladkras

答えて

13

GCCとClangは、ソースファイルをUTF-8として扱います。あなたのLinux端末はおそらくUTF-8にも設定されています。したがってcout<< "привет"には、UTF-8文字列がUTF-8端末に印刷されています。すべてうまくいきます。

wcout<< L"привет"は、ワイド文字を端末の文字エンコーディングに変換するために、適切なLocale設定に依存します。変換が機能するには、ロケールを初期化する必要があります(default "classic" aka "C" localeはワイド文字の変換方法がわかりません)。ロケールにはstd::locale::global (std::locale (""))を、環境設定にはstd::locale::global (std::locale ("en_US.UTF-8"))を使用して、特定のロケール(similar to this C example)を使用します。 g++ test.cc && ./a.out(Debianのジェシー・上)この版画 "привет" と

#include <iostream> 
#include <locale> 
using namespace std; 
int main() { 
    std::locale::global (std::locale ("en_US.UTF-8")); 
    wcout << L"привет\n"; 
} 

は、ここでの作業プログラムの完全なソースです。

this answerも参照してください。ワイド文字を標準出力で使用する危険性については、

+0

理由は、C、C++、POSIX規格に準拠しているためです。ありがとう。 – AProgrammer

+0

ありがとう。それでも "привет"はstdリテラルではなく、 'char []'でなければならないというのは驚くべきことです。 – user2029077

+1

@MinimusHeximus: "привет"は、デフォルトでUTF-8のchar []ですが、L "привет"はUTF-16、UTF-32またはUCS-2のwchar []です。 – ArtemGr

関連する問題