chaînes Python c-api et unicode
-
05-09-2019 - |
Question
Je dois convertir entre les objets python et les chaînes de c de codages différents. Passer d'une chaîne de c à un objet unicode était assez simple en utilisant PyUnicode_Decode, mais je ne suis pas sûr de savoir comment aller dans l'autre sens
//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();
}
Je veux créer une autre fonction qui prend la chaîne Unicode python et il met dans un tampon à l'aide d'un encodeing donné, par exemple:
//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")
{
...
}
Je soupçonne qu'il a somthing à voir avec PyUnicode_AsEncodedString mais qui retourne une PyObject donc je ne suis pas sûr de savoir comment mettre cela dans mon tampon ...
Note: les deux méthodes ci-dessus sont des membres d'une classe c ++ Unicode qui enveloppe le python api J'utilise Python 3.0
La solution
Je soupçonne qu'il a somthing à voir avec PyUnicode_AsEncodedString mais qui retourne une PyObject donc je ne suis pas sûr de savoir comment mettre cela dans mon tampon ...
Le PyObject retourné est un PyStringObject, vous avez juste besoin d'utiliser PyString_Size
et PyString_AsString
pour obtenir un pointeur vers la mémoire tampon de la chaîne et memcpy à votre propre tampon.
Si vous êtes à la recherche d'un moyen d'aller directement à partir d'un objet PyUnicode dans votre propre char buffer, je ne pense pas que vous pouvez le faire.