我有一个问题,如果我在std::string中传递了一个错误的编码字符串,所有处理字符串的SWIG包装器都会崩溃,我指的是包含èé等字符的字符串,这些字符对当前语言环境有效,但UTF-8无效。
在我的代码方面,我已经解决了将输入解析为宽字符串并将其转换为UTF-8的问题,但我希望通过异常而不是崩溃来捕获这些类型的错误,难道PyUnicode_Check不会使用这些字符串失败吗?
当调用PyString_AsStringAndSize()时,Swig实际上在SWIG_AsCharPtrAndSize()中崩溃了,这是swig生成的代码:
SWIGINTERN int
SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
{
#if PY_VERSION_HEX>=0x03000000
#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
if (PyBytes_Check(obj))
#else
if (PyUnicode_Check(obj))
#endif
#else
if (PyString_Check(obj))
#endif
{
char *cstr; Py_ssize_t len;
#if PY_VERSION_HEX>=0x03000000
#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
if (!alloc && cptr) {
/* We can't allow converting without allocation, since the internal
representation of string in Python 3 is UCS-2/UCS-4 but we require
a UTF-8 representation.
TODO(bhy) More detailed explanation */
return SWIG_RuntimeError;
}
obj = PyUnicode_AsUTF8String(obj);
if(alloc) *alloc = SWIG_NEWOBJ;
#endif
PyBytes_AsStringAndSize(obj, &cstr, &len);
#else
PyString_AsStringAndSize(obj, &cstr, &len);
#endif
if (cptr) {
碰巧崩溃到最后一个可见的PyString_AsStringAndSize。我注意到字符串是作为std::string传递的,但在中也使用const char*,没有任何区别。
谢谢你的建议!
发布于 2019-04-19 21:08:52
问题是我们仍然在使用3.3.0版本,更新到3.3.7解决了这个问题,在Python发行说明中有几个关于PyUnicode_Check的bug被修复
https://stackoverflow.com/questions/55630151
复制相似问题