2012-12-22 83 views
-1

我在Python模塊中遇到了關於UTF-8/16的不同方法。這是我第一次嘗試編寫Python C模塊,我想知道如何從Unicode對象中獲取所有字節,並用C函數處理它們。正如我所看到的,這些可能被表示爲C char數組中的簡單ASCII字符串?用於處理unicode字符串的Python 2.7/3 C模塊

static PyObject* unicode_worker(PyObject* self, PyObject* args) 
{ 
Py_UNICODE *src; 
int srclen; 
register Py_UNICODE ch; 
wchar_t widecharBuffer[4096]; 

if (! PyArg_ParseTuple(args, "u#", &src, &srclen)) 
    return NULL; 

ch = *src; 

PyUnicode_AsWideChar((PyUnicodeObject *)src, widecharBuffer, srclen-1); 

Py_RETURN_NONE; 
} 

現在,當我使用gdb的,如:

gdb python 
run sh.py 

我可以看到錯誤:

Program received signal SIGSEGV, Segmentation fault. 
0x00000036010b05c8 in PyUnicodeUCS4_AsWideChar() from /usr/lib64/libpython2.7.so.1.0 

什麼能在PyUnicode_AsWideChar調用改進,現在有什麼不好?

UPD:Mats Petersson,現在問題更加清楚了。

+0

你試過了嗎?究竟出了什麼問題? –

回答

1

最後,我發現,我沒有注意到一件重要的事情:Py_UNICODE包含我需要的所有文本數據,僅此而已。此類型的字節大小可能會有所不同,因此應在不同的操作系統中進行檢查。無論如何,我在Linux版本中沒有區別wchar_t和Py_UNICODE,所以我唯一面臨的問題是設置語言環境。它是解決方案只是:

if (! setlocale(LC_ALL, "ru_RU.utf8")) return PyErr_SetFromErrno(SetLocaleError); 
wprintf(L"%ls\n", src); 

現在我可以繼續試用python模塊,這個問題似乎解決了。