C言語文字列をPython文字列に変換する方法


問題
どのようにCの文字列をPythonバイトまたは文字列オブジェクトに変換しますか?
ソリューション
C文字列は一対のchar *int を使用して表しています。文字列は元のバイト文字列ですか?それともUnicode文字列ですか?バイトオブジェクトは、以下のようにPy_BuildValue() を使用して構築することができる。

char *s; /* Pointer to C string data */
int len; /* Length of data */

/* Make a bytes object */
PyObject *obj = Py_BuildValue("y#", s, len);
Unicode文字列を作成する場合は、sがUTF-8符号化データを指していることを知っています。以下の方法が使えます。

PyObject *obj = Py_BuildValue("s#", s, len);
s が他の符号化方式を使用する場合、次のようにPyUnicode_Decode() を使用して文字列を構築することができる。

PyObject *obj = PyUnicode_Decode(s, len, "encoding", "errors");

/* Examples /*
obj = PyUnicode_Decode(s, len, "latin-1", "strict");
obj = PyUnicode_Decode(s, len, "ascii", "ignore");
wchar_t *, len で表される幅の広い文字列があると、いくつかの選択があります。まず、Py_BuildValue() を使ってもいいです。

wchar_t *w; /* Wide character string */
int len; /* Length */

PyObject *obj = Py_BuildValue("u#", w, len);
また、PyUnicode_FromWideChar()も使えます。

PyObject *obj = PyUnicode_FromWideChar(w, len);
広い文字列については、文字データを解析しませんでした。元のUnicodeコードポインタと仮定して、直接Pythonに変換できます。
討論する
Cの文字列をPython文字列に変換することは、I/Oと同じ原則に従う。つまり、Cからのデータはいくつかのデコーダに従って明示的に1つの文字列に復号されなければならない。通常の符号化フォーマットにはASCII、Latin-1、UTF-8が含まれています。符号化方式やデータがバイナリであるとは限らないなら、文字列をバイトに符号化したほうがいいです。オブジェクトを作成すると、Pythonは通常、あなたが提供した文字列データをコピーします。必要であれば、C文字列を後でリリースしてください。また、プログラムをより強固にするためには、NULL終了データに依存して文字列を作成するのではなく、ポインタとサイズ値を同時に使うべきです。
以上はC言語文字列をPython文字列に変換する方法の詳細です。C言語文字列をPython文字列に変換する資料については他の関連記事に注目してください。