请注意,如果我使用 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滑帧”)
在我的 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;
}
对于字符串“控件”,我得到:Êé߉ª∂
对于字符串 u" unicode ",方法 1、2 和 3,我得到相同的结果:Êé߉ª∂
好吧,那我在做什么错???