我正在尝试将Python 3.3嵌入到我们的C++项目中。
Python 3.3似乎引入了UTF-8作为首选存储,PEP 393:“规范选择UTF-8作为将字符串暴露给C代码的推荐方式。”
我编写了以下初始化代码,看起来很简单直观:
#include <Python.h>
#include "log.h"
void python_init(const char *program_name) {
if (not Py_IsInitialized()) {
Py_SetProgramName(program_name);
Py_Initialize();
const char *py_version = Py_GetVersion();
log::msg("initialized python %s", py_version);
}
}
但编译失败:
/home/jj/devel/openage/src/engine/python.cpp:13:3: error: no matching function for call to 'Py_SetProgramName'
Py_SetProgramName(program_name);
^~~~~~~~~~~~~~~~~
/usr/include/python3.3/pythonrun.h:25:18: note: candidate function not viable: no known conversion from 'const char *' to 'wchar_t *' for 1st argument
PyAPI_FUNC(void) Py_SetProgramName(wchar_t *);
^
是的,显然,我在这里需要一个
wchar_t *
,但是我看不出char *
无法在这里完成此工作的任何原因。这里的最佳做法是什么?
将
char *
转换为wchar *
并处理语言环境(mbstowcs),这还会引入不必要的动态内存分配吗?另外,如果Python决定完全使用
wchar
,为什么Py_GetVersion()
返回我期望的char *
?我找到了similar question for Python <3.3 ,但我希望Python 3.3有所不同(PEP 393?)。
该代码必须具有跨平台功能。
=>将C字符串(
char *
)传递给Python 3.3的快速有效的解决方案是什么? 最佳答案
// Convert a sequence of strings to an array of WCHAR pointers
PYWINTYPES_EXPORT void PyWinObject_FreeWCHARArray(LPWSTR *wchars, DWORD str_cnt);
你可以用这个...吗?
关于python - Python 3.3 C字符串处理(wchar_t vs char),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21591908/