Bir C programına bir Python yorumlayıcısını yerleştirdim. C programının bir bayttan bir diziden bir char dizisine okunduğunu ve baytların belirli bir kodlamayla (örn. ISO 8859-1, Windows-1252 veya UTF-8) metinleri temsil ettiğini (bir şekilde) öğrenir. Bu char dizininin içeriğini bir Python dizesine nasıl çözebilirim?Dizede ASCII olmayan karakterler olduğunda bir C dizesini (karakter dizisi) bir Python dizesine dönüştürme işlemi nasıl yapılır?
Python dizesi genel olarak unicode
türünde olmalıdır; örneğin, Windows-1252 kodlu girişindeki 0x93
, u'\u0201c'
haline gelir.
PyString_Decode
'u kullanmayı denedim, ancak dizede ASCII olmayan karakterler olduğunda her zaman başarısız oluyor.
#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;
}
hata mesajı biz PyString_Decode
çağrısında windows_1252
belirtmek olsa ascii
kodlama bile kullanıldığını gösterir ki, UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
geçerli: Burada başarısız bir örnektir. Bir Unicode gösterimi dizesi deşifre etmek istemiyorum
#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;
}
Niteliği almak için, bir C dizesi bir char [] değil, char * –
Nitelemek için, bir değere başvururken önemli değildir. Diziler zaten işlevlere işaretçi olarak geçirilir. – gnud