在 C 中将 char* 转换为 wchar*
Posted
技术标签:
【中文标题】在 C 中将 char* 转换为 wchar*【英文标题】:Convert char* to wchar* in C 【发布时间】:2011-06-17 02:32:52 【问题描述】:我想在 C 中将 char*
字符串转换为 wchar*
字符串。
我找到了很多答案,但大多数都是针对 C++ 的。你能帮帮我吗?
谢谢。
【问题讨论】:
char*
中的原始编码是什么? UTF8? ANSI?你系统上的sizeof(wchar)
是什么,它依赖什么编码? UCS-2(16 位)? UCS-4(32 位)?
@Benoit:哇...我以为sizeof(wchar)
总是2,不是吗?
@Mehrdad:不一定是2。它是实现定义的。如果在 Windows 上编程,它的大小为两个字节并保存 UTF-16,并带有双 wchar_t 用于代理对。
@Benoit: o__O 我确实不知道它是由实现定义的...有趣,感谢您提供的信息。
在unix系统上,所以我想没关系吧?
【参考方案1】:
如果您当前有 ANSI 字符。只需在每个字符前插入一个 0 ('\0') 并将它们转换为 wchar_t*。
【讨论】:
【参考方案2】:你要找的是
mbstowcs
就像从 char* 到 char* 的复制函数一样
但在这种情况下,您将保存到 wchar_t*
【讨论】:
【参考方案3】:尝试使用 swprintf
和 %hs
标志。
例子:
wchar_t ws[100];
swprintf(ws, 100, L"%hs", "ansi string");
【讨论】:
今晚我会试试,目前我无法访问 shell。谢谢 @NickDandoulakis 我认为这个答案可能非常有用,但是我发现 swprintf 可能有 2 个可能的接口,你能看看这个问题吗? ***.com/q/17716763/2436175 @Antonio 需要缓冲长度的接口是可移植的。 @NickDandoulakis 例如,它不会在 Mingw 4.5.2 上编译,所以很遗憾不是通用的! 在 linux 平台上交叉编译到 mingw 时这是一个很好的解决方案【参考方案4】:setlocale()
后跟mbstowcs()
。
【讨论】:
只要输入的是ANSI字符串就可以了。 @Benoit:是的,字符串转换显然不仅仅是调用单个函数。但我没有提供任何细节,因为我认为这就是 OP 正在寻找的所有内容...... 输入来自 LdapDirectory,所以我猜是 UTF8 吗? @Benoit:没有“ANSI 字符串”这样的东西。如果原始字符串是与当前设置的语言环境相对应的多字节格式,这将起作用。 我已经找到了这个函数,但是我不能正确使用它,我只想将一个字符串编码为 unicode 以在邮件主题标题中发送。谢谢你【参考方案5】:如果您碰巧有可用的 Windows API,则转换函数 MultiByteToWideChar 提供了一些从不同编码到 UTF-16 的可配置字符串转换。如果您不太关心可移植性并且不想弄清楚不同语言环境设置对字符串转换的确切含义,那么这可能更合适。
【讨论】:
以上是关于在 C 中将 char* 转换为 wchar*的主要内容,如果未能解决你的问题,请参考以下文章