Python 3.3 C 字符串处理(wchar_t 与 char)

Posted

技术标签:

【中文标题】Python 3.3 C 字符串处理(wchar_t 与 char)【英文标题】:Python 3.3 C string handling (wchar_t vs char) 【发布时间】:2014-02-06 00:56:10 【问题描述】:

我正在尝试将 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 的快速有效的解决方案是什么?

【问题讨论】:

你试过char*而不是const char*吗? 【参考方案1】:
// Convert a sequence of strings to an array of WCHAR pointers
PYWINTYPES_EXPORT void PyWinObject_FreeWCHARArray(LPWSTR *wchars, DWORD str_cnt);

你能用这个吗...?

【讨论】:

这不是 /usr/include/python3.3 中可用的功能,我认为它是 Windows® 特定的。【参考方案2】:

在 Python 3.5 中,Py_DecodeLocale 可用于进行转换。

https://docs.python.org/3/c-api/sys.html#c.Py_DecodeLocale

【讨论】:

以上是关于Python 3.3 C 字符串处理(wchar_t 与 char)的主要内容,如果未能解决你的问题,请参考以下文章

C++中怎么将WCHAR字符串转换成CHAR字符串?

C++ , winapi 比较两个 WCHAR * 字符串

使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?

c++0x中wchar_t的命运如何?

如何在 C 中将 wchar_t 转换为 BYTE*

使用 boost 或标准库的 wchar 参数