Python 测试可转换字符的wchar_t*

Python 测试可转换字符的wchar_t*,python,c,widechar,Python,C,Widechar,我正在与一个将字符串作为wchar\t数组处理的库进行对话。我需要将它们转换为字符数组,以便将它们交给Python(使用SWIG和Python的PyString_FromString函数)。显然,并非所有宽字符都可以转换为字符。根据wcstombs的文档,我应该能够做如下操作 wcstombs(NULL, wideString, wcslen(wideString)) 为了测试字符串中是否有不可转换的字符,如果有,应该返回-1。然而,在我的测试用例中,它总是返回-1。下面是我的测试函数: vo

我正在与一个将字符串作为wchar\t数组处理的库进行对话。我需要将它们转换为字符数组,以便将它们交给Python(使用SWIG和Python的PyString_FromString函数)。显然,并非所有宽字符都可以转换为字符。根据wcstombs的文档,我应该能够做如下操作

wcstombs(NULL, wideString, wcslen(wideString))
为了测试字符串中是否有不可转换的字符,如果有,应该返回-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));
}    
知道我做错了什么吗


另一方面,如果您知道一种直接从wchar_t*s转换为Python unicode字符串的方法,那将是受欢迎的。:)谢谢

很明显,正如您所发现的,输入数据的零终止非常重要

关于最后一段,我将从wide转换为UTF8并调用


请注意,我假设您使用的是Python2.x,它在Python3.x中可能完全不同。

有人向我指出,我忘记了在字符串中写入终止符。将for循环更改为大小-1,然后将“\0”作为最后一个字符写入,这使得wcstombs能够正常工作。很抱歉浪费你的时间!虽然如果有人知道一个比通过char更直接的转换,那还是很棒的。这可能不是问题,但是你应该传递0作为wcstombs的count参数。这意味着输出缓冲区的大小(以字节为单位),为空。
Generated 32 characters, nominal length 39, compare -1
Generated 16 characters, nominal length 20, compare -1
Generated 4 characters, nominal length 6, compare -1