2014-02-06 47 views
6

我想在我們的C++項目中嵌入Python 3.3。 Python 3.3似乎已經引入了UTF-8作爲首選存儲,PEP 393:「該規範選擇UTF-8作爲將字符串暴露給C代碼的推薦方式。」Python 3.3 C字符串處理(wchar_t vs char)

我寫了這個初始化代碼,這似乎是簡單而直觀:

#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的快速高效的解決方案?

+0

你試過'char *'而不是'const char *'嗎? –

回答

0
// Convert a sequence of strings to an array of WCHAR pointers 
PYWINTYPES_EXPORT void PyWinObject_FreeWCHARArray(LPWSTR *wchars, DWORD str_cnt); 

你能用這個嗎?

+0

這不是'/ usr/include/python3.3'中的一個函數,我認爲這是Windows®特有的。 – TheJJ