He incorporado un intérprete de Python en un programa C. Supongamos que el programa C lee algunos bytes de un archivo en una matriz char y aprende (de alguna manera) que los bytes representan texto con cierta codificación (por ejemplo, ISO 8859-1, Windows-1252 o UTF-8). ¿Cómo decodifico los contenidos de esta matriz char en una cadena de Python?Cómo convertir una cadena C (matriz char) en una cadena Python cuando hay caracteres no ASCII en la cadena?
La cadena de Python debería ser, en general, del tipo unicode
-por ejemplo, una entrada codificada con 0x93
en Windows-1252 pasa a ser u'\u0201c'
.
He intentado utilizar PyString_Decode
, pero siempre falla cuando hay caracteres que no son ASCII en la cadena. Aquí hay un ejemplo que falla:
#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;
}
El mensaje de error es UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
, lo que indica que la codificación ascii
se utiliza a pesar de que especificamos windows_1252
en la llamada a PyString_Decode
.
El código siguiente funciona alrededor del problema utilizando PyString_FromString
para crear una cadena de Python de los bytes no decodificados, a continuación, llamando a su método 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;
}
Para elegir nit, una cadena en C es un char [], no un char * –
Para elegir nit, al hacer referencia a un valor, no importa. Las matrices se pasan como punteros a las funciones, de todos modos. – gnud