9个回答
展开全部
1.string 中存放到是 char。它是个可变长度。即中文专2个字节。英文专1个盯毕字节。
而wchar_t 是定长的。不管是否是中纯漏文还是英语都用2个字节存放。
简单一点就用 _bstr_t 这个类吧。它重载做则烂来 const char* 和const wchar_t *.
如:
string test = "中国人abc"
_bstr_t a(test.c_str());
const wchar_t * = a;
你可以看看_bstr_t类到帮组。
而wchar_t 是定长的。不管是否是中纯漏文还是英语都用2个字节存放。
简单一点就用 _bstr_t 这个类吧。它重载做则烂来 const char* 和const wchar_t *.
如:
string test = "中国人abc"
_bstr_t a(test.c_str());
const wchar_t * = a;
你可以看看_bstr_t类到帮组。
追问
请问_bstr_t类需要包含什么头文件?我编译失败。
追答
#include
展开全部
这里有2个的现成的函数敬竖:
std::wstring MBytesToU16(const char* lpcszString)
{
int len = strlen(lpcszString);
int unicodeLen = MultiByteToWideChar(GBKCP, 0, lpcszString, -1, NULL, 0);
wchar_t* pUnicode = new wchar_t[unicodeLen + 2];
memset(pUnicode, 0, (unicodeLen + 2) * sizeof(wchar_t));
MultiByteToWideChar(GBKCP, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
wstring wString = (wchar_t*)pUnicode;
delete [] pUnicode;
return wString;
}
std::wstring UTF8ToU16(const char* lpcszString)
{
int len = strlen(lpcszString);
int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0);
wchar_t* pUnicode;
pUnicode = new wchar_t[unicodeLen + 2];
memset((void*)pUnicode, 0, (unicodeLen + 2) * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
wstring wstrReturn(pUnicode);
delete [] pUnicode;
//wprintf(L"U82U16 [%s]",wstrReturn.c_str());
return wstrReturn;
}
因为不知型正道你遇到的问题中的string中的字符串是什亮租大么编码的.所以这两个函数,第一个是GBK转Unicode ,第二个是Utf8转Unicode的.
std::wstring MBytesToU16(const char* lpcszString)
{
int len = strlen(lpcszString);
int unicodeLen = MultiByteToWideChar(GBKCP, 0, lpcszString, -1, NULL, 0);
wchar_t* pUnicode = new wchar_t[unicodeLen + 2];
memset(pUnicode, 0, (unicodeLen + 2) * sizeof(wchar_t));
MultiByteToWideChar(GBKCP, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
wstring wString = (wchar_t*)pUnicode;
delete [] pUnicode;
return wString;
}
std::wstring UTF8ToU16(const char* lpcszString)
{
int len = strlen(lpcszString);
int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0);
wchar_t* pUnicode;
pUnicode = new wchar_t[unicodeLen + 2];
memset((void*)pUnicode, 0, (unicodeLen + 2) * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
wstring wstrReturn(pUnicode);
delete [] pUnicode;
//wprintf(L"U82U16 [%s]",wstrReturn.c_str());
return wstrReturn;
}
因为不知型正道你遇到的问题中的string中的字符串是什亮租大么编码的.所以这两个函数,第一个是GBK转Unicode ,第二个是Utf8转Unicode的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是赋值给wchar_t数组吧?
这是一种宽字符格式,利用strcpu(char* dest,const char* source)的话是不行的,因为宽字符跟UNICODE的存储模式不同,如果直接这样操作的话,只会讲第一明态个数组元素复制完成,因为UNICODE是双自己存储的,每一个字母是16为,在char类型芹誉的后面激首源都填充00,会认为是字符串的结束符\0.所以有两种方法,
要么是一个一个元素复制,利用循环,
要么利用宽字符拷贝函数wstrcpy(wchar_t,wchar_t)
这是一种宽字符格式,利用strcpu(char* dest,const char* source)的话是不行的,因为宽字符跟UNICODE的存储模式不同,如果直接这样操作的话,只会讲第一明态个数组元素复制完成,因为UNICODE是双自己存储的,每一个字母是16为,在char类型芹誉的后面激首源都填充00,会认为是字符串的结束符\0.所以有两种方法,
要么是一个一个元素复制,利用循环,
要么利用宽字符拷贝函数wstrcpy(wchar_t,wchar_t)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
std::string是字符串,wchar_t是宽字符,没有办法直接赋值。
std::string可以通码戚并过windows的API函数MultiByteToWideChar()转换成std::wstring,也就是宽字符串,然迟迹后可以提取相应的宽仔或字符。
std::string可以通码戚并过windows的API函数MultiByteToWideChar()转换成std::wstring,也就是宽字符串,然迟迹后可以提取相应的宽仔或字符。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用我的方法最简单了:
string str="this is a string";
wchar_t sz[100];
swprintf_s(sz,100,L"%S",str.c_str());
这里要注意拦颂答%S是简慧大写字樱咐母S
string str="this is a string";
wchar_t sz[100];
swprintf_s(sz,100,L"%S",str.c_str());
这里要注意拦颂答%S是简慧大写字樱咐母S
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询