2013-09-07 39 views
10

Tại saocout << "привет"; hoặc wcout << L "привет";

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

hoạt động tốt trong khi

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

không? (trong Qt Creator cho linux)

+1

Có lẽ, vì bất kỳ điều gì nhận được các ký tự đó là đầu ra "không hiểu ký tự rộng". Nếu bạn mô tả "Không hoạt động" nhiều hơn một chút, nó có thể hữu ích. –

+0

nó in ???? thay vào đó trong cửa sổ đầu cuối. Tuy nhiên cách "привет" có thể là unicode? – user2029077

+4

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

Trả lời

13

GCC và Clang mặc định để xử lý tệp nguồn dưới dạng UTF-8. Thiết bị đầu cuối Linux của bạn có lẽ cũng được cấu hình thành UTF-8. Vì vậy, với cout<< "привет" có một chuỗi UTF-8 được in trong thiết bị đầu cuối UTF-8, tất cả đều tốt.

wcout<< L"привет" tùy thuộc vào cấu hình Locale thích hợp để chuyển đổi các ký tự rộng thành mã hóa ký tự của thiết bị đầu cuối. Locale cần được khởi tạo để chuyển đổi hoạt động (số default "classic" aka "C" locale không biết cách chuyển đổi các ký tự rộng). Sử dụng std::locale::global (std::locale ("")) cho Ngôn ngữ để khớp với cấu hình môi trường hoặc std::locale::global (std::locale ("en_US.UTF-8")) để sử dụng một Ngôn ngữ cụ thể (similar to this C example).

Đây là nguồn đầy đủ các chương trình công tác:

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

Với g++ test.cc && ./a.out này in "привет" (trên Debian Jessie).

Xem thêm this answer về các mối nguy hiểm khi sử dụng ký tự rộng với đầu ra chuẩn.

+0

Lý do phù hợp với các tiêu chuẩn C, C++ và POSIX. – AProgrammer

+0

cảm ơn. nhưng nó đáng ngạc nhiên rằng "привет" không phải là std literal nó phải là 'char []'. – user2029077

+1

@MinimusHeximus: "привет" là char [] theo UTF-8 theo mặc định, L "привет", tuy nhiên, là wchar [] trong UTF-16, UTF-32 hoặc UCS-2. – ArtemGr

Các vấn đề liên quan