【问题标题】:Testing wchar_t* for convertable characters测试 wchar_t* 的可转换字符
【发布时间】:2011-11-04 18:54:28
【问题描述】:

我正在与一个将字符串作为 wchar_t 数组处理的库进行交流。我需要将这些转换为 char 数组,以便我可以将它们交给 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));
}    

这是生成这样的输出:

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 字符串的方法,那将是受欢迎的。 :) 谢谢!

【问题讨论】:

  • 有人指出我忘了给字符串写一个终止符。将 for 循环更改为 size - 1,然后将 '\0' 作为最后一个字符写入,这使得 wcstombs 能够自行运行。很抱歉浪费您的时间!虽然如果有人知道比通过 char 更直接的转换,那仍然很棒。
  • 这可能不是问题,但您应该将 0 作为 wcstombs 的计数参数传递。这意味着输出缓冲区的大小(以字节为单位),为 NULL。

标签: python c widechar


【解决方案1】:

显然,正如您所发现的,零终止输入数据至关重要。

关于最后一段,我会从 Wide 转换为 UTF8 并调用 PyUnicode_FromString

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

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2018-08-12
    • 1970-01-01
    • 2015-02-15
    • 2018-09-02
    • 2014-11-12
    • 1970-01-01
    • 2012-09-09
    • 2015-02-27
    相关资源
    最近更新 更多