char* 和 wchar_t* 如何互相转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了char* 和 wchar_t* 如何互相转换相关的知识,希望对你有一定的参考价值。

char* 和 wchar_t* 如何互相转换

参考技术A #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
main()

wchar_t wStr[100]=0;
char cStr[100]=0;
const wchar_t *p=wStr;

/*设置环境,否则不能转换。*/
setlocale(LC_ALL, "zh_CN.UTF-8");

strcpy(cStr,"测试");
mbstowcs(wStr, cStr, sizeof(wStr) - 1);
printf("wStr=[%ls],len=%d\n",wStr,wcslen(wStr));

mbstate_t ps;
memset(&ps,0,sizeof(ps));
memset(cStr,0,sizeof(cStr));
wcsrtombs(cStr,&p,sizeof(cStr) - 1, &ps);
printf("cStr=[%s],len=%d\n",cStr,strlen(cStr));

参考技术B C函数可以用
wcstombs - 将宽字符转换成多字符
mbstowcs - 把多字符把转换成宽字符
要在windows下面可以用
WideCharToMultiByte和MultiByteToWideChar进行互转本回答被提问者采纳

如何定义宏以将连接的char字符串转换为C中的wchar_t字符串

【中文标题】如何定义宏以将连接的char字符串转换为C中的wchar_t字符串【英文标题】:how to define macro to convert concatenated char string to wchar_t string in C 【发布时间】:2012-05-30 16:18:11 【问题描述】:

和Visual Studio中的_T()宏一样,我定义并使用了自己的_L宏为:

#define _L(x)  __L(x)
#define __L(x) L ## x

适用于:

wprintf(_L("abc\n"));

但是得到一个编译错误:

wprintf(_L("abc\n""def\n"));

它报告“不能连接具有不同字符类型的字符串文字”。 我也做过:

#define _L2(x)  __L2(x)
#define __L2(x) L ## #x
wprintf(_L2("abc\n""def\n"));

代码被编译,但\n 不能作为新行的转义序列。 \n 变成两个字符,wprintf 的输出是:

"abc\n""def\n"

如何使用宏将两个连接的字符字符串转换为wchar_t?问题是我有一些已经存在的宏:

#define BAR  "The fist line\n" \
             "The second line\n"

我想在编译期间将它们转换为 wchar 字符串。 windows下编译器为ICC。

编辑_L 宏在 gcc 中有效,MSVC 和 ICC 无效,这是一个编译器错误。 感谢@R.. 给我评论。

【问题讨论】:

如果我没记错的话,你不需要写宏。只需将字符串彼此相邻放置,它们就会自动连接成一个。至少这适用于 gcc。 这纯粹是 MSVC 中的一个错误。 C 语言允许连接不同宽度的字符串,结果是一个宽字符串。 @nhahtdh 我不是要连接两个字符串。我想将联系字符串转换为 wchar。 L"" 连接是转换为宽字符串的标准规范方式。 看起来 MSVC 符合 C89 但不符合 C99。见***.com/questions/2192416/… 【参考方案1】:

我认为你做不到。

宏只是做简单的文本处理。他们可以在开头添加L,但不能说"abc\n" "def\n"是两个字符串,需要添加两次L

如果将字符串传递给以逗号分隔而不是串联的宏,则可以取得进展:L("abc\n", "def\n")

定义只接受两个字符串的L 很简单:#define L2(a,b) _L(a) _L(b) 将其概括为具有一个获取任意数量参数并在正确位置添加Ls 的宏是可能的,但更复杂。你可以在 Jens Gustedt's P99 macros 中找到聪明的宏做这些事情。

【讨论】:

是的,如果 C 编译器正确支持 C99 标准(如 GCC),我可以。另一个问题说这个***.com/questions/2192416/… @RolandXu,预处理器不能做他想做的事,即生成L"abc" L"def"。编译器可以(尽管 MSVC 似乎不能)将L"abc" "def" 完全视为一个宽字符串。 @ugoren 好的,明白了。预处理器不能。编译器可以如果支持 c99

以上是关于char* 和 wchar_t* 如何互相转换的主要内容,如果未能解决你的问题,请参考以下文章

qt上的char * 和 QString互相转换

cc++ char*和wchar*互相转换

Java中byte[]和char[]互相转换

[转载] C++ string, const char*, char* 之间互相转换

如何将char*转换为wchar

多字节和宽字节互相转换