2012-12-15 15 views
6

वर्तमान में मैं एक प्लगइन लिख रहा हूं जो कि मौजूदा पुस्तकालय के आसपास सिर्फ एक रैपर है। प्लगइन का होस्ट मुझे एक यूटीएफ -16 स्वरूपित स्ट्रिंग पास करता है जो निम्नलिखितutf16 ushort सरणी को utf8 std :: स्ट्रिंग में कैसे परिवर्तित करें?

टाइपपीफ हस्ताक्षरित छोटा PA_Unichar;

और लिपटे पुस्तकालय मुझे फेंक, केवल एक स्थिरांक चार * या एक std :: स्ट्रिंग utf-8 स्वरूपित स्ट्रिंग मैं की तरह

std::string toUtf8(const PA_Unichar* data) 
{ 
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
return std::string(convert.to_bytes(static_cast<const char16_t*>(data)); 
} 

लेकिन स्पष्ट रूप से एक रूपांतरण समारोह यह काम नहीं करता लेखन की कोशिश की स्वीकार करता है एक संकलन त्रुटि "static_cast 'कॉन्स्ट पॉइंटर' (उर्फ 'कॉन्स अनगिनत शॉर्ट *') से 'const char16_t *' को अनुमति नहीं है"

तो ऐसा करने का सबसे सुरुचिपूर्ण/सही तरीका क्या है?

अग्रिम धन्यवाद।

+0

आपके मंच पर 'std :: is_same :: value' का मूल्य क्या है? इसके अलावा, कौन सा कंपाइलर? – moshbear

+0

'std :: is_same :: value' का मान 0 (झूठा) है और मैं ऐप्पल एलएलवीएम कंपाइलर 4.1 के साथ मैक पर संकलन कर रहा हूं, हालांकि मैं इसे विजुअल स्टूडियो 2012 – Robotex

+1

के साथ संकलित करता हूं http के अनुसार : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2018.html, 'char16_t'' uint16_least_t' है, 'uint16_t' नहीं। आपके प्लेटफॉर्म पर, ऐसा लगता है कि 'uint16_least_t' * नहीं * * हस्ताक्षरित शॉर्ट 'के लिए उपनाम है, इस प्रकार' sizeof (char16_t)! = Sizeof (unsigned short)'। 'static_cast' पॉइंटर प्रकारों पर असफल हो जाएगा जब अंतर्निहित 'आकार का मिलान नहीं होता है। – moshbear

उत्तर

2

आप char16_t के एक सूत्र के PA_unichar स्ट्रिंग परिवर्तित कर सकते हैं basic_string(Iterator, Iterator) निर्माता का उपयोग कर, तो std::codecvt_utf8_utf16 पहलू का उपयोग के रूप में आप का प्रयास किया:

std::string conv(const PA_unichar* str, size_t len) 
{ 
    std::u16string s(str, str+len); 
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
    return convert.to_bytes(s); 
} 

मुझे लगता है कि यह सही है। दुर्भाग्य से मैं इसका परीक्षण नहीं कर सकता, क्योंकि मेरा कार्यान्वयन अभी तक इसका समर्थन नहीं करता है। मेरे पास wstring_convert का कार्यान्वयन है जिसे मैं जीसीसी 4.9 में शामिल करने की योजना बना रहा हूं, लेकिन मेरे पास इसका परीक्षण करने के लिए codecvt_utf8_utf16 का कार्यान्वयन नहीं है।

+0

आपको बहुत धन्यवाद, ऐसा लगता है कि यह अच्छी तरह से काम करता है और यह मुझे कुछ भयानक प्रकार से बचाता है :) – Robotex

+0

बढ़िया, मुझे खुशी है कि मेरे सिर में कंपाइलर को सही प्रकार की जांच मिल गई! ब्याज से, आप किस कंपाइलर का उपयोग कर रहे हैं जो उन वर्गों का समर्थन करता है? –

+0

मै मैक-आधारित सिस्टम पर एलएलवीएम 4.1 कंपाइलर (फ्लैग '-std = C++ 11') को सेट करने के बाद और विंडोज सिस्टम – Robotex

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