Как извлечь строку unicode с boost.python

Кажется, что код сработает, когда я сделаю 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 перевод в этом случае.

Ответ 2

Вы пробовали

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

или

extract<wchar_t*>(...)