2011-07-08 5 views
14

ऐसा लगता है कि जब मैं कोड extract<const char*>("a unicode string")कैसे boost.python के साथ एक यूनिकोड स्ट्रिंग को निकालने के लिए

किसी को भी पता है कि यह कैसे हल करने के लिए कर दुर्घटना होगा?

void process_unicode(boost::python::object u) { 
    using namespace boost::python; 
    const char* value = extract<const char*>(str(u).encode("utf-8")); 
    std::cout << "The string value is '"<< value << "'" << std::endl; 
} 

आप:

+0

कोई निश्चित उत्तर नहीं है, लेकिन [यहां] (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014720.html) और [यहां] (http: // मेल .python.org/pipermail/cplusplus-sig/200 9-जुलाई/014664.html) मुझे कुछ संदर्भ मिले हैं जो आपके लिए ब्याज की हो सकती हैं – mac

+0

क्या यह त्रुटि आपको मिल रही है? "TypeError: कोई पंजीकृत कनवर्टर इस पायथन ऑब्जेक्ट प्रकार के यूनिकोड से char टाइप करने के लिए C++ पॉइंटर निकालने में सक्षम था।" क्या आप उदाहरण कोड दे सकते हैं और/या आप जो करने की कोशिश कर रहे हैं उसका विचार दे सकते हैं? –

+1

क्या आप इस प्रश्न को स्पष्ट कर सकते हैं? यह वास्तव में स्पष्ट नहीं है। निकालने के लिए आप क्या तर्क देते हैं? क्या यह एक शाब्दिक स्ट्रिंग है? एक बढ़ावा :: पायथन :: ऑब्जेक्ट? – eudoxos

उत्तर

1

आप

extract<std::string>("a unicode string").c_str() 

या

extract<wchar_t*>(...) 
3

यह संकलित करने की कोशिश की और अपने उदाहरण स्ट्रिंग और अजगर 2.x उपयोग करने के साथ मेरे लिए काम करता है, है a specific from-python converter लिख सकते हैं, अगर आपको स्वतः कनवर्ट करना चाहते हैं(@ पायथन 2.एक्स) से const wchar_t* या ICU से एक प्रकार के लिए (जो कि सी ++ पर यूनिकोड से निपटने के लिए सामान्य सिफारिश प्रतीत होता है)।

आप यूनिकोड वर्ण जो ASCII सीमा में नहीं हैं (उदाहरण के लिए, इस तरह के उच्चारण वर्ण á, ç या ï के रूप में, आप जरूरत से-अजगर कनवर्टर लिखने के लिए होगा करने के लिए पूर्ण समर्थन चाहते हैं। यह नोट करना होगा पाइथन 2.x और 3.x के लिए अलग से किया जाना है, यदि आप दोनों का समर्थन करना चाहते हैं। पायथन 3.x के लिए, PyUnicode type was deprecated और अब स्ट्रिंग प्रकार PyUnicode के रूप में काम करता है जो पाइथन 2.x. के लिए उपयोग किया जाता है कुछ भी नहीं #if PY_VERSION_HEX >= 0x03000000 की को संभाल नहीं कर सकते हैं।

[संपादित करें]

उपर्युक्त टिप्पणी गलत थी। ध्यान दें, चूंकि पाइथन 3.x सामान्य तारों के रूप में यूनिकोड स्ट्रिंग का इलाज करता है, boost::python इसे boost::python::str ऑब्जेक्ट्स में लपेट देगा। मैंने सत्यापित नहीं किया है कि उन्हें कैसे प्रबंधित किया जाता है w.r.t. इस मामले में यूनिकोड अनुवाद।

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