بيثون C-API وسلاسل يونيكود
-
05-09-2019 - |
سؤال
أحتاج إلى التحويل بين كائنات بيثون و C سلاسل من الترميزات المختلفة. كان الذهاب من سلسلة AC إلى كائن Unicode بسيط إلى حد ما باستخدام Pyunicode_Decode، ومع ذلك، لست متأكدا من كيفية الذهاب في الاتجاه الآخر
//char* can be a wchar_t or any other element size, just make sure it is correctly terminated for its encoding
Unicode(const char *str, size_t bytes, const char *encoding="utf-16", const char *errors="strict")
:Object(PyUnicode_Decode(str, bytes, encoding, errors))
{
//check for any python exceptions
ExceptionCheck();
}
أريد إنشاء وظيفة أخرى تأخذ سلسلة Unicode Python ووضعها في مخزن مؤقت باستخدام مزود معين، على سبيل المثال:
//fills buffer with a null terminated string in encoding
void AsCString(char *buffer, size_t bufferBytes,
const char *encoding="utf-16", const char *errors="strict")
{
...
}
أظن أن لديها شيء له علاقة ب Pyunicode_asencodededstring ولكن هذا يعيد Pyobject لذلك أنا لست متأكدا من كيفية وضع ذلك في المخزن المؤقت الخاص بي ...
ملاحظة: كلتا الطريقتين أعلاه هي أعضاء في فئة Unicode C ++ التي تلتف على Python API، فأنا باستخدام Python 3.0
المحلول
أظن أن لديها شيء له علاقة ب Pyunicode_asencodededstring ولكن هذا يعيد Pyobject لذلك أنا لست متأكدا من كيفية وضع ذلك في المخزن المؤقت الخاص بي ...
تعد Pyobject عاد pystringoBject، لذلك تحتاج فقط إلى استخدام PyString_Size
و PyString_AsString
للحصول على مؤشر إلى المخزن المؤقت السلسلة و MEMCPY ذلك إلى المخزن المؤقت الخاص بك.
إذا كنت تبحث عن وسيلة للذهاب مباشرة من كائن Pyunicode إلى المخزن المؤقت Char الخاص بك، لا أعتقد أنه يمكنك القيام بذلك.