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+ 拉绳