代码之家  ›  专栏  ›  技术社区  ›  Matthew Iselin

Python:将Unicode字符串传递给C++模块

  •  6
  • Matthew Iselin  · 技术社区  · 14 年前

    目前我正在使用一个现有的模块,它提供了一个C++接口,并用字符串进行了一些操作。

    我需要使用Unicode字符串,不幸的是模块不支持Unicode接口,所以我编写了一个额外的函数来添加到接口:

    void SomeUnicodeFunction(const wchar_t* string)
    

    但是,当我尝试在Python中使用以下代码时:

    SomeModule.SomeUnicodeFunction(ctypes.c_wchar_p(unicode_string))
    

    ArgumentError: Python argument types in
        SomeModule.SomeUnicodeFunction(SomeModule, c_wchar_p)
    did not match C++ signature:
        SomeUnicodeFunction(... {lvalue}, wchar_t const*)
    

    (名称已更改)。

    我尝试将C++模块中的WCHARGT更改为PyuUnCoD,但没有成功。如何解决这个问题?

    2 回复  |  直到 14 年前
        1
  •  2
  •   sorin    14 年前

    对于Linux,您不必更改API,只需执行以下操作:

    SomeModule.SomeFunction(str(s.encode('utf-8')))
    

    在Windows上,所有Unicode API都使用UTF-16 LE(Little Endian),因此您必须这样编码:

    SomeModule.SomeFunctionW(str(s.encode('utf-16-le')))
    

    很高兴知道

        2
  •  2
  •   Matthew Iselin    14 年前

    找到了解决问题的方法:

    SomeModule.SomeUnicodeFunction(str(s.encode('utf-8')))
    

    到目前为止,它似乎对我的目的起到了很好的作用。

    更新:实际上,使用UTF-8意味着我不需要SomeUnicodeFunction,可以使用标准SomeFunction而不需要专门使用unicode。我想每天都要学些新东西:)。