在C语言中将char*转换为wchar*

21

我想在C语言中将char*字符串转换为wchar*字符串。

我找到了很多答案,但大部分都是针对C++的。你能帮帮我吗?

谢谢。


2
你的 char* 使用的是什么原始编码?UTF8?ANSI?你的系统中 wcharsizeof 是多少,它所依赖的编码是什么?UCS-2(16位)?UCS-4(32位)? - Benoit
@Benoit:哇...我以为sizeof(wchar)始终为2,不是吗? - user541686
@Mehrdad:它不一定是2。这是实现定义的。如果在Windows上编程,它的大小为两个字节,并且保存UTF-16,使用双wchar_t来处理代理对。 - Benoit
@Benoit:o__O 我不知道它是实现定义的……有趣,谢谢你提供的信息。 - user541686
这是在Unix系统上,所以我猜这没关系,对吧? - Crupuk
显示剩余2条评论
5个回答

30

尝试使用 %hs 标志和 swprintf 函数。

示例:

wchar_t  ws[100];
swprintf(ws, 100, L"%hs", "ansi string");

@NickDandoulakis 我认为这个答案可能非常有用,但我发现swprintf可能有两个可能的接口,请您看一下这个问题?http://stackoverflow.com/q/17716763/2436175 - Antonio
@Antonio 需要缓冲区长度的接口是可移植的。 - Nick Dandoulakis
@NickDandoulakis 在 Mingw 4.5.2 上无法编译,因此很遗憾它并不普适! - Antonio
在 Linux 平台上交叉编译到 MinGW 时,这是一个不错的解决方案。 - Octopus
请注意,这似乎适用于任何printf函数,幸运的是。 - rookie1024
显示剩余5条评论

5

只要输入是 ANSI 字符串,这就没问题。 - Benoit
@Benoit:是的,字符串转换显然不仅仅是调用一个函数。但我没有给出任何细节,因为我认为这就是OP所寻找的... - user541686
输入来自 LdapDirectory,所以我猜它是一个 UTF8? - Crupuk
3
“ANSI字符串”这个说法其实并不存在。如果原始字符串是多字节格式,并且与当前设置的区域设置相对应,那么这将起作用。 - caf
我已经找到了这个函数,但是我无法正确使用它,我只想将一个字符串编码为Unicode以在邮件主题头中发送。谢谢你。 - Crupuk
@Crupuk:源字符串是什么格式?如果它只是ASCII,并且您想在UTF-8邮件头中使用它,则不需要进行任何转换。 - caf

4
你所需要的是:
mbstowcs

这个函数的工作方式类似于从char*到char*的复制功能

但是在这种情况下,您要保存到一个wchar_t*中


0
如果您恰好有Windows API可用,转换函数MultiByteToWideChar提供了一些可配置的字符串转换,从不同的编码转换为UTF-16。如果您不太关心可移植性,并且不想弄清楚不同区域设置对字符串转换的影响,那么这可能更合适。

-4

如果您目前有 ANSI 字符,请在每个字符之前插入一个 0 ('\0') 并将它们转换为 wchar_t*。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接