【问题标题】:Python Unicode object and C API ( retrieving char* from pyunicode objects )Python Unicode 对象和 C API(从 pyunicode 对象中检索 char*)
【发布时间】:2011-10-10 15:23:42
【问题描述】:

我目前正在将我的所有 C++ 引擎类绑定到 python 以用于游戏脚本。 最新的挑战是,当你在脚本中创建一个字符串时,例如

string = 'hello world'

这变成了一个 PyUnicodeObject。接下来,我们要在脚本中从绑定的 C 端函数调用此对象的函数。 PrintToLog(string),例如,可以说这个 c-function 就是这样

void PrintToLog( const char * thisString )
{
   //file IO stuff as expected
   myLog << thisString;
   //more stuff involving fileIO
}

所以我的绑定需要从 PyUnicodeObject 中提取一个 char * ,它首先由 python 传递给我的通用函数处理程序,然后它将提取 pyobjects 并将其转换为正确的 c 端类型并将其传递给我的功能。

我能找到的唯一函数提取 wchar_t*... 无论如何都可以获得 ascii 表示,因为我们只会使用 ascii 字符集。

编辑:我正在使用 Python 3.2,其中所有字符串都是 unicode

【问题讨论】:

    标签: python string unicode binding ascii


    【解决方案1】:

    我相信您正在寻找的功能是PyUnicode_AsASCIIString。这将为您提供一个非 unicode (ASCII) python 字符串。然后您可以采用常规方法从中提取char*

    【讨论】:

    • 返回的对象是否仍然定义为 PyUnicodeObject?如果是这样,我可以调用 PyUnicode_AS_DATA 来获取对象的内部缓冲区,但是如果没有这样返回,那么存在什么函数可以让我提取 char *?
    • 好的,这似乎得到了结果。目前它是一串随机数据,但我能够提取数据。一旦我发现我做错了什么,一切都会好起来的。谢谢两位的帮助=)
    • (如果你还在……)您能否扩展一下“从中提取char* 的正常方法”?我试图弄清楚如何获得char*,我看到 PyUnicode_AsASCIIString 返回一个PyObject*...我可以使用PyUnicode_AsUTF8吗?
    • @lindes 当然,我在这里写了一些(希望接近有效的)伪代码:gist.github.com/eberle1080/7103201
    【解决方案2】:

    我在使用 Python3 时遇到了类似的问题。我解决了如下。

    如果你有 PyUnicodeObject"mystring",请执行类似的操作

    PyObject * ascii_mystring=PyUnicode_AsASCIIString(mystring);
    PrintToLog(PyBytes_AsString(ascii_mystring));
    Py_DECREF(ascii_mystring);
    

    PyBytes 解释here

    【讨论】:

    • 最好在PyUnicode_AsASCIIString 之后添加NULL 检查,以防字符串无法进行ASCII 编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多