Mam wbudowany interpreter Python w programie C. Załóżmy, że program C odczytuje niektóre bajty z pliku do tablicy char i uczy się (w jakiś sposób), że bajty reprezentują tekst o określonym kodowaniu (np. ISO 8859-1, Windows-1252 lub UTF-8). Jak odszyfrować zawartość tablicy char w łańcuchu Pythona?Jak przekonwertować łańcuch C (tablicę znaków) na ciąg znaków w języku Python, gdy w ciągu znaków występują znaki spoza zestawu znaków ASCII?
Łańcuch w języku Python powinien być generalnie typu unicode
- na przykład kod 0x93
w formacie Windows-1252 staje się u'\u0201c'
.
Podjęto próbę użycia PyString_Decode
, ale zawsze kończy się niepowodzeniem, gdy w ciągu występują znaki spoza ASCII. Oto przykład, który kończy się niepowodzeniem:
#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;
}
Komunikat o błędzie jest UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
, co oznacza, że kodujące ascii
służy chociaż określić windows_1252
w zaproszeniu do PyString_Decode
.
Poniższy kod działa wokół problemu za pomocą PyString_FromString
aby utworzyć ciąg Pythona z niezdekodowane bajtów, a następnie wywołanie decode
metody:
#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;
}
Aby wybrać Nit, łańcuch C to znak char [], a nie znak * –
Aby wybrać nit-pick, odwołanie do wartości nie ma znaczenia. W każdym razie tablice są przekazywane jako wskaźniki do funkcji. – gnud