这就是我要做的事情:
typedef uint16_t uchar16_t;
uchar16_t buf[32];
// buf will contain timezone information like GMT-6, Eastern Daylight Time, etc
char * str = "Test";
for (int i = 0; i <= strlen(str); i++)
buf[i] = str[i];
我猜这不正确,因为uchar16_t包含2个字节,str包含1个字节。
我应该做什么?
答案 0 :(得分:3)
strlen的? BUF [32]?试图摧毁宇宙?
你想使用wstringstream。
std::wstringstream lols;
lols << "Test";
std::wstring cakes;
lols >> cakes;
编辑@评论: 你不应该使用strlen,因为任何体面的字符串系统都允许嵌入的零,而strlen非常慢。此外,您没有根据需要调整缓冲区的大小,因此如果您的字符串大小为&gt; 31你会得到缓冲区溢出。此外,您必须(之后动态调整缓冲区大小)手动释放它。这两件事都是C字符串系统的严重缺陷。我的示例代码使您的标准库编写器完成所有工作,并为您避免所有这些问题。
答案 1 :(得分:1)
如果你的字符串永远是ASCII,那实际上是可以的。为了正确地执行此操作,可移植函数是mbstowcs,它假定您从默认语言环境转换,或者如果您在Windows上,则可以使用API函数来明确指定源代码页。
答案 2 :(得分:0)
只要str
是ASCII,您的代码就可以运行;但是,在循环条件下调用strlen()
可能是一个坏主意。如果您的系统上有swprintf()
,可能更容易使用uchar16_t buf[32];
char *str = "Test";
swprintf(buf, sizeof buf, "%s", str);
:
{{1}}
答案 3 :(得分:0)
另外,您是否有充分的理由定义自己的类型?
如果您有一个(窄)字符串,则无法将其转换为 通过将您的语言环境设置为“C”然后传递来获取wchar_t字符串 字符串通过mbstowcs()。那是因为“C”语言环境指定 特定字符编码,该编码可能不匹配 执行字符集的编码,所以mbstowcs()可能 将字符映射到意外的东西,甚至可能失败 (如果执行字符集碰巧使用了编码 与C语言环境的编码结构不兼容 字符集。)
因此,为了转换char 字符串变成更宽的字符串,你有 把字符逐个复制成一个 wchar_t数组。如果你需要工作 使用Unicode或utf-16或其他 之后,那么wcstombs()就是这样 你应该看看。