Кажется, что код сработает, когда я сделаю extract<const char*>("a unicode string")
Кто-нибудь знает, как это решить?
Ответ 1
Это компилируется и работает для меня, с вашим примером строки и с использованием 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;
}
Вы можете написать конкретный из-python-конвертер, если вы хотите автоматически конвертировать PyUnicode (@Python2.x) в const wchar_t* или к типу ICU (это, как представляется, общая рекомендация для работы с Unicode на С++).
Если вам нужна полная поддержка символов Unicode, которые не входят в диапазон ASCII (например, с акцентированными символами, такими как á, ç или ï), вам нужно будет написать преобразователь from-python. это нужно сделать отдельно для Python 2.x и 3.x, если вы хотите поддерживать оба. Для Python 3.x тип PyUnicode устарел, и теперь тип строки работает как PyUnicode, используемый для Python 2.x. Ничего, что пара #if PY_VERSION_HEX >= 0x03000000 не может обрабатывать.
[править]
Вышеупомянутый комментарий был неправильным. Обратите внимание, что поскольку Python 3.x обрабатывает строки unicode как обычные строки, boost::python переносит это в объекты boost::python::str. Я не проверял, как обрабатываются w.r.t. Unicode перевод в этом случае.