2016-03-18 7 views
1

PyUnicodeオブジェクトを持っていますが、私はCの文字列(char *)に変換しようとしています。PyUnicode文字列とC文字列の間の文字列変換はどのように行われますか?

私はそれをやろうとしている方法は機能していないようです。ここに私のコードです:

PyObject * objectCompName = PyTuple_GET_ITEM(compTuple, (Py_ssize_t) 0); 
PyObject * ooCompName = PyUnicode_AsASCIIString(objectCompName); 
char * compName = PyBytes_AsString(ooCompName); 
Py_DECREF(ooCompName); 

私はこれを行う必要があります別の/より良い方法はありますか?

+0

"動作していないようです"を定義します。あなたはクラッシュしますか?結果はあなたが望んでいたものと違っていますどちらの場合でも、正確には何ですか? –

+0

あなたはPythonのどのバージョンで作業していますか? –

+0

@JohnBollingerここに来たらセグメンテーションが失敗します。 Python 3. – ComputerLocus

答えて

4

UTF-8がchar *がOKでエンコードされた場合、あなたは間違いなく(Pythonの3.3が必要)PyUnicode_AsUTF8AndSizeを使用する必要があります。

PyObject * objectCompName = PySequence_GetItem(compTuple, 0); 
if (! objectCompName) { 
    return NULL; 
} 

size_t size; 
char *ptr = PyUnicode_AsUTF8AndSize(objectCompName, &size); 
if (!ptr) { 
    return NULL; 
} 

// notice that the string pointed to by ptr is not guaranteed to stay forever, 
// and you need to copy it, perhaps by `strdup`. 

も、であることを理解してくださいは、あなたのコードで実行したすべてのPy*関数呼び出しの戻り値を確認してください。 compTupletuple、または0原因IndexErrorない場合はここで

PyTuple_GetItemNULLを返します。 PyUnicode_AsUTF8AndSizeobjectCompNamestrオブジェクトでない場合はNULLを返します。戻り値を無視し、CPythonは条件が正しい場合にSIGSEGVでクラッシュします。

+0

PyUnicode文字列はもともと 'PyUnicode_DecodeASCII'を使って別のC関数で作られています。 – ComputerLocus

+0

その場合、 'PyUnicode_AsUTF8AndSize'は非常に上手です。 –

+0

大丈夫です。あなたは戻り値をチェックすることが必須であると述べています。私はそれらを確認する予定です、私はちょうどテストし、それが最初に動作することを確認したいと思っていただけではありません。実際には戻り値を確認する必要がありますか、それとも非常に良い方法であると言っているだけですか? – ComputerLocus

0

最初にPythonのPyUnicodeを非Unicode Python文字列に変換する必要があります(詳しくはhttps://docs.python.org/2/c-api/unicode.html#ascii-codecsを参照)。結果をchar*に簡単に変換できます。以下は

を続行するのに役立つ擬似コードです:

// Assumption: you have a variable named "pyobj" which is 
// a pointer to an instance of PyUnicodeObject. 

PyObject* temp = PyUnicode_AsASCIIString(pyobj); 
if (NULL == temp) { 
    // Means the string can't be converted to ASCII, the codec failed 
    printf("Oh noes\n"); 
    return; 
} 

// Get the actual bytes as a C string 
char* c_str = PyByteArray_AsString(temp); 

// Use the string in some manner 
printf("The python unicode string is: %s\n", c_str); 

// Make sure the temp stuff gets cleaned up at the end 
Py_XDECREF(temp); 
+1

'PyByteArray_AsString(temp);'の行はsegfaultです。 – ComputerLocus

関連する問題