2010-04-29 9 views
12

के साथ सी ++ यूटीएफ -8 आउटपुट मैं सी ++ आईसीयू पुस्तकालय के साथ शुरू करने के लिए संघर्ष कर रहा हूं। मैंने काम करने के लिए सबसे सरल उदाहरण प्राप्त करने का प्रयास किया है, लेकिन यह भी असफल रहा है। मैं बस एक यूटीएफ -8 स्ट्रिंग आउटपुट करना चाहता हूं और फिर वहां से जाऊंगा।आईसीयू

यहाँ मैं क्या है:

#include <unicode/unistr.h> 
#include <unicode/ustream.h> 

#include <iostream> 

int main() 
{ 
    UnicodeString s = UNICODE_STRING_SIMPLE("привет"); 

    std::cout << s << std::endl; 

    return 0; 
} 

यहाँ आउटपुट है:

$ g++ -I/sw/include -licucore -Wall -Werror -o icu_test main.cpp 
$ ./icu_test 
пÑÐ¸Ð²ÐµÑ 

मेरे टर्मिनल और फ़ॉन्ट का समर्थन UTF-8 और मैं नियमित रूप से UTF-8 के साथ टर्मिनल का उपयोग करें। मेरा स्रोत कोड यूटीएफ -8 में है।

मुझे लगता है कि शायद मुझे आउटपुट स्ट्रीम को यूटीएफ -8 में सेट करने की आवश्यकता है क्योंकि आईसीयू यूटीएफ -16 के रूप में तारों को स्टोर करता है, लेकिन मुझे सच में यकीन नहीं है और मैंने सोचा होगा कि ऑपरेटर ustream.h द्वारा प्रदान किए जाएंगे वैसे भी करो।

किसी भी मदद की सराहना की जाएगी, धन्यवाद।

+1

क्या आपने std :: wcout का उपयोग करने का प्रयास किया है? – Milan

+1

हां, लेकिन आईसीयू ऑपरेटर प्रदान नहीं करता है << इसके लिए, इसलिए मुझे g ++ से त्रुटियों की एक लंबी सूची मिलती है। – Isaac

+0

क्या आपने wcout पर एक बग फाइल किया था? (कृपया? :) (औचित्य के साथ?) –

उत्तर

12

आपका कार्यक्रम काम करेगा: मैक्रो आप उपयोग कर रहे थे

UnicodeString s("привет"); 

only for strings that contain "invariant characters", i.e., only latin letters, digits, and some punctuation है।

जैसा कि पहले कहा गया था, इनपुट/आउटपुट कोडपेज मुश्किल हैं। आप ने कहा:

मेरे टर्मिनल और फ़ॉन्ट का समर्थन UTF-8 और मैं नियमित रूप से UTF-8 के साथ टर्मिनल का उपयोग करें। मेरा स्रोत कोड यूटीएफ -8 में है।

यह सच हो सकता है, लेकिन आईसीयू को यह सच नहीं है। प्रक्रिया कोडपेज अलग हो सकता है (आइए आईएसओ -885 9 -1 कहें), और आउटपुट कोडपेज अलग हो सकता है (चलिए शिफ्ट-जेस कहते हैं)। फिर, कार्यक्रम काम नहीं करेगा। लेकिन, एपीआई UNICODE_STRING_SIMPLE का उपयोग कर परिवर्तक वर्ण अभी भी काम करेंगे।

उम्मीद है कि इससे मदद मिलती है।

SRL, आईसीयू देव

+0

धन्यवाद! यह वास्तव में काम करता है। चूंकि आपने 'आईसीयू देव' के साथ साइन आउट किया है, शायद आपको पता चलेगा: क्या आप आईसीयू सहायता के लिए किसी भी आईआरसी चैनल के बारे में जानते हैं? मैंने खोज की, लेकिन मुझे कोई नहीं मिला। – Isaac

+0

मुझे किसी भी आईआरसी चैनलों के बारे में पता नहीं है - क्या हम लोकप्रिय हैं? मैं कभी-कभी यहां देखता हूं (और कभी-कभी अन्य वेब खोज करता हूं) लेकिन http://icu-project.org पर हमारी आईसीयू-समर्थन मेलिंग सूची और बग डेटाबेस मुख्य चैनल हैं। यह एक दिलचस्प विचार है। आप इसे वहां प्रस्तावित कर सकते हैं। मैं सी/सी ++ के लिए आईसीयू के लिए तकनीकी नेतृत्व हूं। –

+0

ठीक है, मैं पिछले कुछ दिनों में काफी खोज कर रहा हूं, यूनिकोड समाधान की तलाश में हूं और आईसीयू को मैंने पढ़े गए सभी स्रोतों से सी ++ के लिए 'सर्वश्रेष्ठ' माना जाता है। सभी स्रोत भी शिकायत करते हैं कि दस्तावेज़ीकरण में कमी आई है और वही बात कहने वाले कई अन्य मंच पोस्ट हैं। यह देखते हुए कि मुझे काम करने के लिए 'हैलो वर्ल्ड' शैली कार्यक्रम भी नहीं मिला, मैं इसके साथ सहमत हूं, क्षमा करें। मुझे पता है कि यह आपकी गलती नहीं है, लेकिन यदि आपके पास कोई प्रभाव है, तो कृपया दस्तावेज़ों को सुधारने के बारे में कुछ सुझाव दें। – Isaac

2

यदि आप एक फाइल करने के लिए उत्पादन लिखना क्या होता है

कि निर्धारित करेंगे या नहीं, यह टर्मिनल कि विफल रहता है (या तो टर्मिनल से पाइप का उपयोग कर रीडायरेक्ट या कार्यक्रम अपने आप में एक फ़ाइल धारा खोलने के द्वारा) सही ढंग से आउटपुट को संभालने के लिए।

यदि आप डीबगर में आउटपुट स्ट्रिंग का निरीक्षण करते हैं तो क्या होता है? क्या इसमें सही मान हैं? पता लगाएं कि आपकी स्ट्रिंग का यूटीएफ -8 एन्कोडिंग जैसा दिखता है, और डीबगर में आपको जो मिलता है उसके मुकाबले इसकी तुलना करें। या प्रत्येक बाइट के अभिन्न मूल्य को मुद्रित करें, और सत्यापित करें कि वे सही हैं।

एन्कोडिंग के साथ काम करते समय यह निर्धारित करने के लिए हमेशा मुश्किल (लेकिन आवश्यक) होता है कि समस्या आपके प्रोग्राम में या रूपांतरण में होती है जब पाठ सिस्टम पर आउटपुट होता है। टर्मिनल को समीकरण से बाहर निकालें और सत्यापित करें कि आपका प्रोग्राम सही आउटपुट उत्पन्न करता है। अगर आप सिर्फ करने के लिए प्रारंभकर्ता बदलने

+0

फाइल को लिखना एन्कोडिंग डीबगिंग में एक बहुत अच्छा कदम है। –

+0

मैंने अभी फ़ाइल में लिखा है और मुझे एक ही आउटपुट मिलता है। मैं अभी डीबगर में एक नज़र डालेगा। – Isaac

1

operator<<(ostream, UnicodeString) आईसीयू के "डिफ़ॉल्ट कनवर्टर" का उपयोग करके UTF16 और वर्ण के बीच धर्मान्तरित।AFAIU, "डिफ़ॉल्ट कनवर्टर" (यदि आप इसे ucnv_setDefaultName() के साथ स्पष्ट रूप से सेट नहीं करते हैं) प्लेटफॉर्म पर निर्भर करता है और जिस तरह से आईसीयू संकलित किया गया था। ucnv_getDefaultName() से आप क्या प्राप्त करते हैं?

+1

FWIW स्टैंडअलोन टूल 'icuinfo' डिफ़ॉल्ट कोडपेज 4.4 के रूप में रिपोर्ट करता है। डिफ़ॉल्ट कनवर्टर कई जंगली और अद्भुत जगहों से आ सकता है। –

+0

मेरी समस्या अब हल हो गई है, लेकिन आपके प्रश्न का उत्तर देने के लिए, मुझे 'en_GB' मिलता है। – Isaac

+1

icuinfo को कुछ ऐसा वापस करना चाहिए: डिफ़ॉल्ट लोकेल: en_US ... डिफ़ॉल्ट कनवर्टर: यूटीएफ -8 –

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