char *到wchar_t *函数实现

时间:2013-07-28 22:17:44

标签: c++ c unicode

我正在尝试实现将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;
}

2 个答案:

答案 0 :(得分: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

A resource建议:

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

答案 1 :(得分:1)

以下是一些明显的问题:

  1. 您没有为NUL终结器分配空间。

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

  3. 你假设你正在使用一个小端架构,这也不一定是真的(虽然它可能是真的)。​​

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

  5. 假设这只适用于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)