2011-07-08 26 views
14

Có vẻ như rằng mã sẽ sụp đổ khi tôi làm extract<const char*>("a unicode string")làm thế nào để trích xuất một chuỗi unicode với Boost.Python

Bất cứ ai cũng biết làm thế nào để giải quyết này?

+0

Không có câu trả lời dứt khoát, nhưng [ở đây] (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014720.html) và [tại đây] (http: // thư .python.org/pipermail/cplusplus-sig/2009-July/014664.html) Tôi tìm thấy một số tài liệu tham khảo mà bạn có thể quan tâm – mac

+0

Đây có phải là lỗi bạn đang nhận không? "TypeError: Không có công cụ chuyển đổi đã đăng ký nào có thể trích xuất một con trỏ C++ để nhập char từ đối tượng Python kiểu unicode này." Bạn có thể cung cấp mã ví dụ và/hoặc đưa ra ý tưởng về những gì bạn đang cố gắng làm không? –

+1

Bạn có thể làm rõ câu hỏi không? Nó thực sự không rõ ràng. Đối số bạn đưa ra để trích xuất là gì? Nó là một chuỗi chữ? Một tăng :: python :: đối tượng? – eudoxos

Trả lời

1

Các bạn đã thử

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

hoặc

extract<wchar_t*>(...) 
3

này biên dịch và làm việc cho tôi, với ví dụ của bạn chuỗi và sử dụng Python 2.x:

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; 
} 

Bạn có thể viết a specific from-python converter, nếu bạn muốn tự động chuyển đổi PyUnicode (@ Python2.x) đến const wchar_t* hoặc đến một loại từ ICU (dường như là đề xuất chung để xử lý Unicode trên C++).

Nếu bạn muốn hỗ trợ đầy đủ cho các ký tự unicode mà không phải là trong phạm vi ASCII (ví dụ, ký tự có dấu như á, ç hay ï, bạn sẽ cần để viết từ-python chuyển đổi. Lưu ý này sẽ có được thực hiện riêng biệt cho Python 2.x và 3.x, nếu bạn muốn hỗ trợ cả hai. Đối với Python 3.x, PyUnicode type was deprecated và bây giờ kiểu chuỗi hoạt động như PyUnicode được sử dụng cho Python 2.x. Không có gì mà một cặp vợ chồng của #if PY_VERSION_HEX >= 0x03000000 không thể xử lý .

[biên tập]

Nhận xét ở trên không đúng. Lưu ý rằng, kể từ Python 3.x xử lý các chuỗi unicode như các chuỗi bình thường, boost::python sẽ bao bọc các đối tượng đó thành các đối tượng boost::python::str. Tôi chưa xác minh cách những người đó được xử lý w.r.t. unicode dịch trong trường hợp này.

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