2011-08-26 61 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中都是不同的。