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. utf8转std::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::string转utf8字符串
// 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
- Py_BuildValue()返回NULL的原因及解决方法;string在char和utf-8编码之间互转
- 【ANDROID】Android 在oncreate() 方法中调用 findViewById 返回 null 问题的原因和解决方法
- PHP json_decode的坑 仅仅支持utf-8编码的字符,gbk编码会返回null
- string 和char * char[]之间的转换
- string char *和char[] 之间的转换
- response.setCharacterEncoding("UTF-8")不生效的原因及解决方法
- char* char[]及string之间的区别及转换
- const char *,char * ,string,char []之间的关系和转换
- UTF-8、UTF-16、UTF-32之间的编码转换
- 字符编码:Unicode和UTF-8之间的关系
- 字符编码:Unicode和UTF-8之间的关系
- CString、string 和char* 之间的转换总结(转)
- char,string和CString 之间的比较
- string和char数组之间的转换
- char*,string和CString之间的转换
- char*,string和CString之间的转换
- jstring 和string char*之间的转换
- char*,string和CString之间的转换
- HDU - 1421 搬寝室 解题报告
- 题目1209:最小邮票数
- eclipse编译源码慢的解决方法
- STM32f103——ILI9341
- codeforces 764C Timofey and a tree (思维题)
- Py_BuildValue()返回NULL的原因及解决方法;string在char和utf-8编码之间互转
- Android 高版本API方法在低版本系统上的兼容性处理
- WebGIS中地图恢复初始位置及状态
- Java的封装
- 【Inno Setup】Gif插件2.1
- c# checked关键字
- 初步使用EventBus (一)
- python学习笔记1——python 中 Tkinder 使用常见问题
- LINUX分区、目录挂载