win32控制台里 wchar_t字符串转成char数组!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32控制台里 wchar_t字符串转成char数组!相关的知识,希望对你有一定的参考价值。

win32控制台里 wchar_t字符串转成char数组,中文字符串乱码。求解决方法。
wchar_t lujing="1223333中文";
char mnv[500];
ProWstringToString(mnv,lujing);//这个是转换操作。ProWstringToString是别的软件转换函数。
string nex;//类
for(int i=0; i<wcslen(lujing); i++)

nex+=mnv[i];

cout<<nex;

微软对中文编码很扯淡,给你写段能用的

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <Windows.h>

 

int main( void )


 

 wchar_t *src = L"adf中国ad";

 char * des = NULL;

 int len= WideCharToMultiByte(CP_ACP,0,src,wcslen(src),NULL,0,NULL,NULL);

 des=(char *)malloc(sizeof(char) * (len + 1));

 WideCharToMultiByte(CP_ACP,0,src,wcslen(src),des,len,NULL,NULL); 

 des[len] = '\\0';

 printf("%s", des);

 getchar();

 free(des);

 return 0;

 

来自:求助得到的回答
参考技术A char型的数据,占用一个字节空间。
wchar_t的数据,占用多个字节空间。
从存储空间大小来看,char型的可以直接转换为wchar_t,但是如果两个字节的wchar_t要转换为单个字节的char型是需要舍弃一个字节的,这样会导致数据丢失,因此,是无法转换为char型数据的。wchar_t只可以转换为char型数组。
char转换为wchar_t,可以强制转换即可。如
char a;
wchar_t b;
b=(wchar_t)a;
而wchar_t转换为char型数组时可以使用内存复制memcpy函数。如:
char a[2];
wchar_t b;
memcpy(a,&b,sizeof(b));
参考技术B VC++自己的示例size_t wcrtomb(
char *mbchar,
wchar_t wchar,
mbstate_t *mbstate
);
template <size_t size>
size_t wcrtomb(
char (&mbchar)[size],
wchar_t wchar,
mbstate_t *mbstate
); // C++ only// crt_wcrtomb.c
// compile with: /W3
// This program converts a wide character
// to its corresponding multibyte character.

#include <string.h>
#include <stdio.h>
#include <wchar.h>

int main( void )

size_t sizeOfCovertion = 0;
mbstate_t mbstate;
char mbStr = 0;
wchar_t* wcStr = L"Q";

// Reset to initial conversion state
memset(&mbstate, 0, sizeof(mbstate));

sizeOfCovertion = wcrtomb(&mbStr, *wcStr, &mbstate); // C4996
// Note: wcrtomb is deprecated; consider using wcrtomb_s instead
if (sizeOfCovertion > 0)

printf("The corresponding wide character \"");
wprintf(L"%s\"", wcStr);
printf(" was converted to the \"%c\" ", mbStr);
printf("multibyte character.\n");

else

printf("No corresponding multibyte character "
"was found.\n");

参考技术C WideCharToMultiByte吧追问

不会用这个函数!求指导

追答

WideCharToMultiByte(CP_ACP, 0, lujing, -1, mnv, sizeof(mnv), NULL, NULL);这样应该可以了。wchar_t lujing[]="1223333中文"; 这里应该是这样吧
看看参考资料吧,刚看到的

参考资料:http://www.cnblogs.com/gakusei/articles/1585211.html

本回答被提问者采纳

来自 wchar_t* 的 C++ Win32 GDI+ 拉绳

【中文标题】来自 wchar_t* 的 C++ Win32 GDI+ 拉绳【英文标题】:C++ Win32 GDI+ drawstring from wchar_t* 【发布时间】:2014-09-22 07:12:02 【问题描述】:

我已经完成了搜索并为此花费了至少一个小时。

wchar_t* fooBar = (wchar_t*)L"BlahBlah\0";
//GetWindowText(pDIS->hwndItem, (wchar_t*)fooBar, 64); 
g->DrawString(fooBar, -1, &font, rectf, &strFormat, textColorUp);

这可以工作,并且可以编译;因为正确绘制了字符串“BlahBlah”。

问题是我想使用已注释掉的 GetWindowText() 的值。

转换可能有问题,但我就是找不到。

【问题讨论】:

【参考方案1】:

您需要为GetWindowText 函数分配空间来写入。您不能提供字符串文字的地址,因为它们是不可修改的。

wchar_t buffer[1024];
GetWindowText(pDIS->hwndItem, buffer, _countof(buffer));
g->DrawString(fooBar, -1, &font, rectf, &strFormat, textColorUp);

【讨论】:

谢谢。我找到了_countof()的宏,即:#define _countof(array) (sizeof(array)/sizeof(array[0])) @EvanCarslake 除非你想被限制在一个固定的最大长度,你可以先调用GetWindowTextLength,然后分配一个动态缓冲区。

以上是关于win32控制台里 wchar_t字符串转成char数组!的主要内容,如果未能解决你的问题,请参考以下文章

来自 wchar_t* 的 C++ Win32 GDI+ 拉绳

将 UTF-16(Windows 上的 wchar_t)转换为 UTF32

vb SendMessage

控制台输出宽字符wchar_t的中文显示问题

wchar_t 和编码

Win32控制台彩色字符输出