Tôi đã nhúng trình thông dịch Python vào chương trình C. Giả sử chương trình C đọc một số byte từ một tệp vào một mảng char và học (bằng cách nào đó) rằng các byte biểu diễn văn bản với một mã hóa nhất định (ví dụ: ISO 8859-1, Windows-1252 hoặc UTF-8). Làm thế nào để giải mã nội dung của mảng char này thành một chuỗi Python?Làm thế nào để chuyển đổi một chuỗi C (mảng char) thành một chuỗi Python khi có các ký tự không phải ASCII trong chuỗi?
Chuỗi Python nói chung phải thuộc loại unicode
— ví dụ: 0x93
trong đầu vào được mã hóa Windows-1252 trở thành u'\u0201c'
.
Tôi đã cố gắng sử dụng PyString_Decode
, nhưng nó luôn thất bại khi có các ký tự không phải ASCII trong chuỗi. Dưới đây là một ví dụ thất bại:
#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;
}
Các thông báo lỗi là UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128)
, mà chỉ ra rằng mã hóa ascii
được sử dụng mặc dù chúng tôi chỉ định windows_1252
trong cuộc gọi đến PyString_Decode
.
Các mã sau đây làm việc xung quanh vấn đề bằng cách sử dụng PyString_FromString
để tạo ra một chuỗi Python của các byte undecoded, sau đó gọi phương thức decode
của nó:
#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;
}
Để chọn nit, chuỗi C là char [], không phải là ký tự char * –
Để chọn nit, khi tham chiếu một giá trị, nó không quan trọng. Tuy nhiên, các mảng được chuyển như các con trỏ tới các hàm. – gnud