Member 13703287 Ответов: 2

Ошибка Pyrun_simplestring для специальных символов


Я пробовал основы встраивания Python в C++, и когда я запускаю этот код, я получаю ошибку
"SyntaxError: (ошибка unicode) кодек 'utf-8' не может декодировать байт 0xf4 в позиции 10
: недопустимый байт продолжения". Я не могу понять, что в этом плохого. Я закодировал этот txt на Pycharm, он работал отлично, но не тогда, когда я пытаюсь встроить его в C++. Заранее благодарю за помощь

PyObject* пинта;

Py_Initialize();

PyRun_SimpleString (расширение"txt = у\"flag_for_Côte_d Ивуара\"\ПХ = тхт.кодирование()\nprint(х)");

Py_Finalize();

printf("\n нажмите любую клавишу для выхода...\n");
если(!_getch()) _getch();
возвращает 0;

если бы я только знал

PyRun_SimpleString("txt = u\"flag_for_Côte_d Ivoire\"")
он терпит неудачу и для этого тоже. Версия Python, которую я использую, - это Python 3.7.3

Что я уже пробовал:

У меня есть разные методы кодирования. Не удалось найти ничего в документах, связанных с PyRun_simplestring.Версия Python, которую я использую, - это Python3.7.3

Richard MacCutchan

Где находится строка с символом 0xf4?

Member 13703287

""этот символ-0xf4. вы можете проверить https://www.rapidtables.com/convert/number/hex-to-ascii.html здесь

Richard MacCutchan

Попробуйте изменить u приставка к u8.

Member 13703287

Я пробовал это не поддерживается в Windows я думаю потому что это дает неверный синтаксис
ошибка. Я работаю над VS 2008.

Richard MacCutchan

VS2008 сейчас очень стар и не поддерживает последний стандарт C++. Вам нужно перейти на 2017 год.

Member 13703287

при использовании с Python 2.7 PyRun_SimpleString работает отлично и принимает ту же строку, тогда как при использовании с Python 3.7.3 он терпит неудачу

Richard MacCutchan

Извините, но у меня нет никаких идей на этот счет.

Member 13703287

Спасибо тебе за помощь, Ричард. Я попробовал с Python 3.0.0, и это не удалось, что показывает, что эта ошибка или ограничение было введено с Python версии 3.0.0 для встраивания с C++

Richard MacCutchan

Смотрите мое решение ниже.

2 Ответов

Рейтинг:
14

Richard MacCutchan

Ну, я не могу поверить, что это работает во 2, но не в 3. Итак, я просто попробовал это снова с Python 3.7, и это работает отлично. Что я действительно заметил, что отличалось от моих вчерашних тестов, так это добавление строки

#define PY_SSIZE_T_CLEAN
перед включением Python.h, как описано в разделе Введение — документация по Python 3.7.3[^].

Итак, мой исходный код теперь читается:
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int main()
{
//    PyObject* pInt;  -- not used

    Py_Initialize();

    PyRun_SimpleString("txt = u\"flag_for_Côte_d’Ivoire\"\nx = txt.encode()\nprint(x)");
    PyRun_SimpleString("txt = u\"flag_for_Côte_d’Ivoire\"\nprint(txt)"); // and text

    Py_Finalize();

    printf("\nPress any key to exit...\n");
}

А вот и выход:
C:\Users\rjmac\Documents\Code\C++>pytest
b'flag_for_C\xc3\xb4te_d\xe2\x80\x99Ivoire'
flag_for_Côte_d’Ivoire

Press any key to exit...


Member 13703287

какую версию Visual Studio вы используете?

Richard MacCutchan

Я нахожусь на VS2017, но это должно быть возможно с VS2008, если вы можете пройти мимо проблемы со специальными символами в вашем тексте.

Member 13703287

Я попробовал Ричарда на моем VS 2008, но это не сработало для меня. Спасибо Ричард

Richard MacCutchan

Я отказался от использования VS2008 несколько лет назад, поэтому не могу проверить его сам. Я думаю, вам нужно обновить его, если вы хотите использовать более современные функции.

Member 13703287

Наконец, рабочая строка преобразуется в UTF-8 перед отправкой в Pyrun_simplestring()

Рейтинг:
1

Gerry Schmitz

Преобразуйте его перед вызовом. Нет никакого смысла делать это в вызове, потому что он ничего не покупает вам, и вы не контролируете "эту" среду (относительно предположений об этой кодировке).

Цитата:
Когда я обнаружил, что популярный инструмент веб-разработки PHP имеет почти полное незнание проблем кодировки символов, беспечно используя 8 бит для символов, что делает чертовски невозможной разработку хороших международных веб-приложений, я подумал: "хватит".


Абсолютный минимум каждый разработчик программного обеспечения абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!) – Джоэл о программном обеспечении[^]


Member 13703287

Спасибо Вам, Джерри Шмитц, за ваш ответ, но преобразование до этого не поможет. Pyrun_simplestring принимает только "simpleString"