嵌入式python传递unicode字符串

时间:2013-08-23 23:15:28

标签: c++ python unicode utf-8

注意如果我使用Ascii,一切都很有效,但是:

在我的utf8编码脚本中我有这个:

print "frøânçïé"

在我的嵌入式C ++中我有这个:

PyObject*        CPython_Script::print(PyObject *args)
{
        PyObject                *resultObjP        = NULL;
        const char                *utf8_strZ        = NULL;

        if (PyArg_ParseTuple(args, "s", &utf8_strZ)) {
                Log(utf8_strZ, false);

                resultObjP = Py_None;
                Py_INCREF(resultObjP);
        }

        return resultObjP;
}

现在,我知道我的Log()可以打印utf8(已经多年,经过很好的调试)

实际打印的内容是:

print "frøânçïé"
frøânçïé

我使用的另一种方法如下所示:     kj_commands.menu(“控件”,“同步滑帧”,“全局无滑帧”)     要么     kj_commands.menu(u“控件”,u“同步滑帧”,u“全局无滑帧”)

在我的C ++中我有:

SuperString                ScPyObject::GetAs_String()
{
        SuperString                str;

        if (PyUnicode_Check(i_objP)) {
                #if 1
                //        method 1
                {
                        ScPyObject                utf8Str(PyUnicode_AsUTF8String(i_objP));

                        str = utf8Str.GetAs_String();
                }
                #elif 0
                //        method 2
                {
                        UTF8Char                *uniZ = (UTF8Char *)PyUnicode_AS_UNICODE(i_objP);

                        str.assign(&uniZ[0], &uniZ[PyUnicode_GET_DATA_SIZE(i_objP)], kCFStringEncodingUTF16);
                }
                #else
                //        method 3
                {
                        UTF32Vec                        charVec(32768); CF_ASSERT(sizeof(UTF32Vec::value_type) == sizeof(wchar_t));
                        PyUnicodeObject                *uniObjP = (PyUnicodeObject *)(i_objP);
                        Py_ssize_t                        sizeL(PyUnicode_AsWideChar(uniObjP, (wchar_t *)&charVec[0], charVec.size()));

                        charVec.resize(sizeL);
                        charVec.push_back(0);
                        str.Set(SuperString(&charVec[0]));
                }
                #endif
        } else {
                str.Set(uc(PyString_AsString(i_objP)));
        }

        Log(str.utf8Z());

        return str;
}

对于字符串,“控件”,我得到:     EESS‰ª∂

对于 unicode 字符串,u“控件”,方法1,2和3,我得到同样的事情:     EESS‰ª∂

好吧,我做错了什么?

0 个答案:

没有答案