我正在尝试实现将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;
}
答案 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)
以下是一些明显的问题:
您没有为NUL终结器分配空间。
您假设wchar_t
是2个字节,这不一定是真的。在许多Linux系统上,它可能代表一个UTF-32代码单元,长度为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)
。