J'ai intégré un interpréteur Python dans un programme C. Supposons que le programme C lit certains octets d'un fichier dans un tableau char et apprenne (en quelque sorte) que les octets représentent du texte avec un certain codage (par exemple, ISO 8859-1, Windows-1252 ou UTF-8). Comment puis-je décoder le contenu de ce tableau char dans une chaîne Python?Comment convertir une chaîne C (tableau char) en une chaîne Python quand il y a des caractères non-ASCII dans la chaîne?
La chaîne Python doit généralement être de type unicode
(par exemple, une entrée codée 0x93
dans Windows-1252 devient u'\u0201c'
).
J'ai essayé d'utiliser PyString_Decode
, mais il échoue toujours lorsqu'il y a des caractères non-ASCII dans la chaîne. Voici un exemple qui échoue:
#include <Python.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char c_string[] = { (char)0x93, 0 };
PyObject *py_string;
Py_Initialize();
py_string = PyString_Decode(c_string, 1, "windows_1252", "replace");
if (!py_string) {
PyErr_Print();
return 1;
}
return 0;
}
Le message d'erreur est UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
, ce qui indique que le codage est utilisé ascii
même si nous précisons windows_1252
dans l'appel à PyString_Decode
.
Le code suivant contourne le problème en utilisant PyString_FromString
pour créer une chaîne Python des octets non décodés, puis appeler sa méthode decode
:
#include <Python.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char c_string[] = { (char)0x93, 0 };
PyObject *raw, *decoded;
Py_Initialize();
raw = PyString_FromString(c_string);
printf("Undecoded: ");
PyObject_Print(raw, stdout, 0);
printf("\n");
decoded = PyObject_CallMethod(raw, "decode", "s", "windows_1252");
Py_DECREF(raw);
printf("Decoded: ");
PyObject_Print(decoded, stdout, 0);
printf("\n");
return 0;
}
Pour sélectionner nit, une chaîne C est un char [], pas un char * –
Pour sélectionner nit, lorsque vous référencez une valeur, cela n'a pas d'importance. Les tableaux sont passés comme des pointeurs sur les fonctions, de toute façon. – gnud