2013-09-07 36 views
10

क्योंcout << "привет"; या wcout << एल "привет";

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

काम करता है अच्छी तरह से करते हुए

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

नहीं करता है? (लिनक्स के लिए क्यूटी निर्माता में)

+1

संभवतः, क्योंकि जो कुछ भी उन पात्रों को आउटपुट के रूप में प्राप्त करता है "व्यापक वर्णों को समझ में नहीं आता है"। यदि आप वर्णन करते हैं कि "काम नहीं करता" थोड़ा और, यह मदद कर सकता है। –

+0

यह प्रिंट करता है ???? इसके बजाय टर्मिनल खिड़की में। हालांकि कैसे "привет" यूनिकोड हो सकता है? – user2029077

+4

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

उत्तर

13

जीसीसी और क्लैंग डिफ़ॉल्ट स्रोत फ़ाइल को यूटीएफ -8 के रूप में मानने के लिए डिफ़ॉल्ट हैं। आपका लिनक्स टर्मिनल शायद यूटीएफ -8 में भी कॉन्फ़िगर किया गया है। तो cout<< "привет" के साथ एक यूटीएफ -8 स्ट्रिंग है जो यूटीएफ -8 टर्मिनल में मुद्रित है, सब कुछ ठीक है।

wcout<< L"привет" विस्तृत वर्णों को टर्मिनल के वर्ण एन्कोडिंग में परिवर्तित करने के लिए उचित Locale कॉन्फ़िगरेशन पर निर्भर करता है। रूपांतरण को काम करने के लिए लोकेल को प्रारंभ करने की आवश्यकता है (default "classic" aka "C" locale विस्तृत वर्णों को परिवर्तित करने के बारे में नहीं जानता है)। किसी विशिष्ट लोकेल (similar to this C example) का उपयोग करने के लिए पर्यावरण कॉन्फ़िगरेशन या std::locale::global (std::locale ("en_US.UTF-8")) से मिलान करने के लिए लोकेल के लिए std::locale::global (std::locale ("")) का उपयोग करें।

#include <iostream> 
#include <locale> 
using namespace std; 
int main() { 
    std::locale::global (std::locale ("en_US.UTF-8")); 
    wcout << L"привет\n"; 
} 
g++ test.cc && ./a.out इस प्रिंट "привет" (डेबियन जेसी पर) के साथ

:

यहाँ काम कर कार्यक्रम का पूर्ण स्रोत है।

मानक आउटपुट के साथ विस्तृत वर्णों का उपयोग करने के खतरों के बारे में this answer भी देखें।

+0

कारण सी, सी ++ और पॉज़िक्स मानकों के अनुरूप है। – AProgrammer

+0

धन्यवाद। फिर भी यह आश्चर्य की बात है कि "привет" std literal नहीं है यह 'char []' होना चाहिए। – user2029077

+1

@MinimusHeximus: "привет" डिफ़ॉल्ट रूप से यूटीएफ -8 में char [] है, एल "привет" हालांकि, यूटीएफ -16, यूटीएफ -32 या यूसीएस -2 में wchar [] है। – ArtemGr

संबंधित मुद्दे