Py_BuildValue()返回NULL的原因及解决方法;string在char和utf-8编码之间互转

来源:互联网 发布:mysql安装教程 编辑:程序博客网 时间:2024/06/14 23:51

Py_BuildValue()返回NULL

问题提出

PyObject* Py_BuildValue(char* format, ...)

构建一个参数列表,把C类型转换为Python对象,使得Python里面可以使用C类型数据。

如果传递一个中文字符串,会返回NULL,而英文正常。


问题原因

如果要传字符串过去,python是utf-8编码的,而string的基础单位是char,一个字节编码,所以不能构建正确的PyObject对象。


问题解决

1.  utf8std::string

转换过程:先将utf8转双字节Unicode编码,再通过WideCharToMultiByte将宽字符转换为多字节。

//----------------------------------------------------------------------- std::string UTF8_To_string(const std::string & str) { int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 memset(pwBuf, 0, nwLen * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen); int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char * pBuf = new char[nLen + 1]; memset(pBuf, 0, nLen + 1); WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string retStr = pBuf; delete []pBuf; delete []pwBuf; pBuf = NULL; pwBuf = NULL; return retStr; } ////////////////////////////////////////////////////////////////////////// 



2.std::stringutf8字符串

//  translate ascii characters to utf-8 characters

转换过程:与1过程相反 

//------------------------------------------------------------------------ std::string string_To_UTF8(const std::string & str) { int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 ZeroMemory(pwBuf, nwLen * 2 + 2); ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char * pBuf = new char[nLen + 1]; ZeroMemory(pBuf, nLen + 1); ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string retStr(pBuf); delete []pwBuf; delete []pBuf; pwBuf = NULL; pBuf  = NULL; return retStr; } //////////////////////////////////////////////////////////////////////////




0 0
原创粉丝点击