我有一个变量CString str;对str进行utf-8编码,str结果如下:“鏉備釜浜嗗緱鍝燂紝鏁翠簡涓”然后定义一个新的变量CString myurl;myurl = str + "&sss";
myurl的值为“鏉備釜浜嗗緱鍝燂紝鏁翠簡涓?sss”
请问为什么会出现“?”?
如果把代码改成 myurl = "&sss" + str;那么就完全正确。
请问错误在什么地方??
myurl的值为“鏉備釜浜嗗緱鍝燂紝鏁翠簡涓?sss”
请问为什么会出现“?”?
如果把代码改成 myurl = "&sss" + str;那么就完全正确。
请问错误在什么地方??
你把utf8和ascii混编,不错才怪
把&sss放在前面,还是错的
WCHAR szUnicode[BUF_SIZE];
char szAnsi[BUF_SIZE];nWCHAR=MultiByteToWideChar(CP_UTF8,0,szUTF,nSize,szUnicode,BUF_SIZE);
nSize=WideCharToMultiByte(CP_ACP,0,szUnicode,nWCHAR,szAnsi,BUF_SIZE,NULL,NULL);
url参数,上传到服务器。但是因为多了一个 ‘?’造成url错误!
const int BUF_SIZE=1024;
WCHAR szUnicode[BUF_SIZE];
char szAnsi[BUF_SIZE];
strcpy(szAnsi,"这里是你要转换成utf8的中英文混合字串"); nWCHAR=MultiByteToWideChar(CP_UTF8,0,szUTF,nSize,szUnicode,BUF_SIZE);
CString CHttpSend::Convert(CString str,int sourceCodePage,int targetCodePage)
{
int len=str.GetLength();
int unicodeLen=MultiByteToWideChar(sourceCodePage,0,str,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodePage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE * pTargetData = NULL;
int targetLen=WideCharToMultiByte(targetCodePage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodePage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt;
rt.Format("%s",pTargetData);
delete pUnicode;
delete pTargetData;
return rt;
}转换本身没有问题,我要问的是,为什么和 “&sss”相加,就多了一个问号??
大家可以按我说的测试,肯定有。因为最后我要拼成一个url字符串,发到服务器!希望大家看懂我的疑难所在!谢谢
//计算字符数
int unicodeLen=MultiByteToWideChar(sourceCodePage,0,str,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodePage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
CString tempstr;
tempstr.Format("%s",pUnicode);
BYTE * pTargetData = NULL;
int targetLen=WideCharToMultiByte(targetCodePage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodePage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt;
rt.Format("%s",pTargetData);
delete pUnicode;
delete pTargetData;
return rt;这个是转换函数
第二、我觉得编码是有问题的。因为比如一句话:“你是我的好朋友” 有些算法编码出来是:“浣犳槸鎴戠殑濂芥湅鍙”
有些算法编码出来是:“浣犳槸鎴戠殑濂芥湅鍙嬪” 这些都是可以反回去的。
我的编码编出来是第一种。
所以我认为编码有问题
测试很简单,编码出来和"&sss"这个字符串相加,没有'?'就是正确的。
void CHttpSend::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1+2];
memset(szUtf8, 0, len + 1+2);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len+1, NULL,NULL); strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}测试如下:
CString strcontent = "你是我的好朋友";ConvertGBKToUtf8(CString& strcontent); //编码CString url = "http://www.csdn.net?content="+ strcontent+"&sss=123";如果url合法,就对了。如果strcontent+"&sss" 之间出现‘?’,这个url就不合法了。你也可以试试先拼接字符串,再编码注意: 偶数个汉字是正确的。奇数个汉字才会出现哪个“?”
现在的条件就这样子的。其他我无法控制。我的url必须正确。否则会返回参数错误!有两个'?' 当然有参数错误了