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)
将其概括为具有一个获取任意数量参数并在正确位置添加L
s 的宏是可能的,但更复杂。你可以在 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* 如何互相转换的主要内容,如果未能解决你的问题,请参考以下文章