Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将unicode字符串传递给C++;模块 我现在在使用一个现有的模块,它提供了一个C++接口,并用字符串进行了一些操作。_C++_Python_Unicode_Module - Fatal编程技术网

Python:将unicode字符串传递给C++;模块 我现在在使用一个现有的模块,它提供了一个C++接口,并用字符串进行了一些操作。

Python:将unicode字符串传递给C++;模块 我现在在使用一个现有的模块,它提供了一个C++接口,并用字符串进行了一些操作。,c++,python,unicode,module,C++,Python,Unicode,Module,我需要使用Unicode字符串,不幸的是模块不支持Unicode接口,因此我编写了一个额外的函数来添加到接口: void SomeUnicodeFunction(const wchar_t* string) 但是,当我尝试在Python中使用以下代码时: SomeModule.SomeUnicodeFunction(ctypes.c_wchar_p(unicode_string)) 我得到这个错误: ArgumentError: Python argument types in So

我需要使用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,但没有成功。如何解决此问题?

找到了解决此问题的方法:

SomeModule.SomeUnicodeFunction(str(s.encode('utf-8')))
到目前为止,就我的目的而言,它似乎工作得很好


更新:事实上,使用UTF-8意味着我不需要任何SomeUnicode函数,可以使用标准SomeFunction,而不需要专门使用unicode。每天学习新东西,我想:)。

对于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')))

好消息:在不同的平台上,wchar\t可以有不同的大小:8位、16位或32位。

Boost.python不会自动识别ctypes类型,据我所知,但它可能只适用于内置unicode字符串。如果您尝试调用
SomeModule.someUnicode函数(unicode\u字符串)
,会发生什么情况?@roup:同样的错误,但是Python参数类型是“unicode”而不是“c\u wchar\u p”。@Matthew,w/或w/o
c\u wchar\u p
强制转换,它看起来应该可以工作,除了
常量
(在代码< Cype < /Cord>文档中没有提到)——如果在C代码中省略了<代码> const <代码>会发生什么?(注意,在<代码> cType 中没有直接的C++支持:当然,函数必须是“代码>外部的c<代码>,当然,从C++的观点来看,”亚历克斯:即使函数声明了外部的“C”在模块暴露的情况下,我仍然会遇到同样的错误。它只是不想使用Unicode字符串——尽管传统的ASCII字符串工作得很好。我知道你有一个解决方法,这很好。我可以问一下这是在哪个编译器/平台上吗?在一些旧的编译器上,wchar\t只是一个typedef,或者是定义错误的,这类事情ils。事实上,我正在使用Linux。我已经更新了我自己对这个问题的答案。