1

我正在尝试实现将 char* 转换为 wchar_t* 的函数。但问题是, wprintf 显示不同的结果。我究竟做错了什么?

wchar_t *toWchar(char *data)
{
    if(!data)
    {
        return NULL;
    }

    int size = strlen(data);
    if(!size)
    {
        return NULL;
    }

    char *temp = (char *)malloc(size * 2);
    if(!temp)
    {
        return NULL;
    }

    int j = 0;
    for(int i = 0; i < size; i++)
    {
        temp[j++] = data[i];
        temp[j++] = '\0';
    }

    return (wchar_t *)temp;
}

编辑:主要功能:

int main()
{
    wchar_t *temp = toWchar("hello, world!");
    if(temp)
        wprintf("%ls\n", temp);
    return 0;
}
4

2 回答 2

2

作为起点;gcc 将为您提供与平台相关的 wchar 类型/大小,如下所示:

echo "" | gcc -E - -dM | grep WCHAR

#define __WCHAR_MAX__ 2147483647
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __WCHAR_TYPE__ int
#define __SIZEOF_WCHAR_T__ 4

资源建议:

“C 和 C++ 都在各自标准的 2011 年修订版中引入了固定大小的字符类型 char16_t 和 char32_t,以提供 16 位和 32 位 Unicode 转换格式的明确表示,而 wchar_t 实现定义。”

于 2013-07-28T22:30:17.337 回答
1

这里有几个明显的问题:

  1. 您没有为 NUL 终止符分配空间。

  2. 您假设这wchar_t是 2 个字节,这不一定是真的。在许多 Linux 系统上,它可能代表一个 4 字节长的 UTF-32 代码单元。

  3. 您假设您使用的是小端架构,这也不一定是正确的(尽管它可能是正确的)。

  4. 您正在调用wprintf()格式const char*字符串,但wprintf()需要一个const wchar_t*参数。编译器应该对此产生错误。(您是否记得添加#include <wchar.h>(对于 C)或#include <cwchar>(对于 C++)?)

假设这仅适用于 ASCII 输入,您可以通过执行以下操作来解决这些问题:

int size = strlen(data) + 1 /* NUL */;
...

// Allocate a wchar_t buffer directly.
// Note that the cast below is necessary in C++ but not in C.
wchar *temp = (wchar_t *)malloc(size * sizeof *temp);
...
int j = 0;
for(int i = 0; i < size; i++)
{
    temp[j++] = data[i];
}

然后当你打电话时wprintf,使用:

wprintf(L"%ls\n", temp); // Note the L prefix to the string literal.

另外,完成后不要忘记打电话free(temp)

于 2013-07-28T22:34:32.677 回答