c-api e Unicode cordas Python
-
05-09-2019 - |
Pergunta
Eu preciso converter entre objetos Python e cordas c de várias codificações. Indo de uma string c para um objeto unicode era bastante simples usando PyUnicode_Decode, no entanto eu não estou certo como ir a outra maneira
//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();
}
Eu quero criar uma outra função que leva a corda e coloca-Unicode python em um buffer usando um determinado encodeing, por exemplo:
//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")
{
...
}
Eu suspeito que foi somthing para fazer com PyUnicode_AsEncodedString no entanto, que retorna um PyObject então eu não tenho certeza de como colocar isso em meu tampão ...
Nota: ambos os métodos acima são membros de uma classe C ++ Unicode que envolve a API do Python Eu estou usando Python 3.0
Solução
Eu suspeito que foi somthing para fazer com PyUnicode_AsEncodedString no entanto, que retorna um PyObject então eu não tenho certeza de como colocar isso em meu tampão ...
O PyObject retornado é um PyStringObject, assim você só precisa usar PyString_Size
e PyString_AsString
para obter um ponteiro para o buffer da corda e memcpy-lo para seu próprio buffer.
Se você está procurando uma maneira de ir diretamente de um objeto PyUnicode em seu próprio buffer char, eu não acho que você pode fazer isso.