2011-08-26 60 views
1

我正在處理與處理字符串爲wchar_t數組的庫。我需要將它們轉換爲char數組,以便我可以將它們交給Python(使用SWIG和Python的PyString_FromString函數)。顯然不是所有的寬字符都可以轉換爲字符。根據對wcstombs的文件,我應該能夠做到像測試wchar_t *爲可轉換字符

wcstombs(NULL, wideString, wcslen(wideString)) 

來測試unconvertable字符字符串 - 它應該返回-1,如果有任何。但是,在我的測試案例中,它總是返回-1。這是我的測試功能:

void getString(wchar_t* target, int size) { 
    int i; 
    for(i = 0; i < size; ++i) { 
     target[i] = L'a' + i; 
    } 
    printf("Generated %d characters, nominal length %d, compare %d\n", size, 
      wcslen(target), wcstombs(NULL, target, size)); 
}  

這像這樣被生成輸出:

Generated 32 characters, nominal length 39, compare -1 
Generated 16 characters, nominal length 20, compare -1 
Generated 4 characters, nominal length 6, compare -1 

任何想法,我做錯了嗎?

在相關說明中,如果您知道直接從wchar_t * s轉換爲Python unicode字符串的方式,那將是值得歡迎的。 :) 謝謝!

+0

有人指出我忘了寫字符串的終止符。將for循環更改爲size - 1,然後將'\ 0'作爲最後一個字符,使得wcstombs自行運行。很抱歉浪費你的時間!儘管如果有人知道比通過char更直接的轉換,那仍然很棒。 – Derakon

+0

它可能不是問題,但應該將0作爲wcstombs的計數參數。這意味着輸出緩衝區的字節大小爲NULL。 –

回答

0

很明顯,正如您發現的那樣,零輸入數據的零終止至關重要。

關於最後一段,我將從寬轉換爲UTF8,並致電PyUnicode_FromString

請注意,我假設您正在使用Python 2.x,它可能在Python 3.x中都是不同的。