注意如果我使用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‰ª∂
好吧,我做错了什么?