在网上找了很久,大致的代码都是源于一个版本的,我复制到了自己的程序里去。
步骤是这样的,首先传一个CString的参数调用url_UTFEncoder函数,例:CString c_input = _T("你好");
我用google翻译试了下,“你好”的网页url上的那种表现形式为“%E4%BD%A0%E5%A5%BD”,三个%号组成一个字,这里6个%号正正好是2个字。但是用下来发现了问题,先贴代码
CString CUTFEncoder::url_UTFEncoder(CString c_input)
{
ConvertGBKToUtf8(c_input);//按照上面所讲,这里得出的c_input长度应该是6,但运行下来是3,直接导致后面
//的for循环得出“%XX%XX%XX”三个%号,这显然不是正确的结果,所以接下来我
//开始检查这个函数。 std::ostrstream utf_code;
std::string outputstring; for (int i=0;i<c_input.GetLength();i++)
{
int temp=c_input[i];
temp=temp&0xff;
utf_code<<'%';
utf_code<<hex<<temp;
}
outputstring=utf_code.str();
int i = c_input.GetLength()*3;
outputstring=outputstring.substr(0,c_input.GetLength()*3);
CString c_outputstring(outputstring.c_str());
return c_outputstring;
}
void CUTFEncoder::ConvertUtf8ToGBK(CString& cstrUtf8)
{
string strUtf8;
WCharToChar( CP_ACP, cstrUtf8.GetBuffer(), strUtf8); int len=MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, (LPWSTR)wszGBK, len); len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL); cstrUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}void CUTFEncoder::ConvertGBKToUtf8(CString& cstrGBK) //cstrGBK == _T("你好")
{
string strGBK;
WCharToChar( CP_ACP, cstrGBK.GetBuffer(), strGBK); //strGBK == _T("你好")
int len=MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL,0);//len == 3
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, (LPWSTR)wszUtf8, len);//wszUtf8 == “你好” len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL); //len == 7
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);//这步之后szUtf8
的之便成了三个字符的乱码,这就是url_UTFEncoder中的到的c_input的值长度是3的原因,所以我猜想问题一定是出在这个函数上了。
cstrGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
由于我对于内码的概念并不是十分了解,所以我只能把调试中得到的数据给出,望大虾们帮小弟一把,看看这些函数问题出在哪里,谢了
步骤是这样的,首先传一个CString的参数调用url_UTFEncoder函数,例:CString c_input = _T("你好");
我用google翻译试了下,“你好”的网页url上的那种表现形式为“%E4%BD%A0%E5%A5%BD”,三个%号组成一个字,这里6个%号正正好是2个字。但是用下来发现了问题,先贴代码
CString CUTFEncoder::url_UTFEncoder(CString c_input)
{
ConvertGBKToUtf8(c_input);//按照上面所讲,这里得出的c_input长度应该是6,但运行下来是3,直接导致后面
//的for循环得出“%XX%XX%XX”三个%号,这显然不是正确的结果,所以接下来我
//开始检查这个函数。 std::ostrstream utf_code;
std::string outputstring; for (int i=0;i<c_input.GetLength();i++)
{
int temp=c_input[i];
temp=temp&0xff;
utf_code<<'%';
utf_code<<hex<<temp;
}
outputstring=utf_code.str();
int i = c_input.GetLength()*3;
outputstring=outputstring.substr(0,c_input.GetLength()*3);
CString c_outputstring(outputstring.c_str());
return c_outputstring;
}
void CUTFEncoder::ConvertUtf8ToGBK(CString& cstrUtf8)
{
string strUtf8;
WCharToChar( CP_ACP, cstrUtf8.GetBuffer(), strUtf8); int len=MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, (LPWSTR)wszGBK, len); len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL); cstrUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}void CUTFEncoder::ConvertGBKToUtf8(CString& cstrGBK) //cstrGBK == _T("你好")
{
string strGBK;
WCharToChar( CP_ACP, cstrGBK.GetBuffer(), strGBK); //strGBK == _T("你好")
int len=MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL,0);//len == 3
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, (LPWSTR)wszUtf8, len);//wszUtf8 == “你好” len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL); //len == 7
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);//这步之后szUtf8
的之便成了三个字符的乱码,这就是url_UTFEncoder中的到的c_input的值长度是3的原因,所以我猜想问题一定是出在这个函数上了。
cstrGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
由于我对于内码的概念并不是十分了解,所以我只能把调试中得到的数据给出,望大虾们帮小弟一把,看看这些函数问题出在哪里,谢了
解决方案 »
- return CView::OnEraseBkgnd(pDC); //这一句,在和不在,有什么不同吗?
- 请问怎么给DLL文件重命名,原来叫A.DLL,我想改成B.DLL,调用时不再调用A.DLL
- DLL隐式连接
- 散分讨论:VC开发数据库程序你一般用什么?ODBC还是OLE DB 还是ADO?
- 祝贺神州5顺利发射,放200
- 我要写一个有关于网络数据传输加密的程序,需要有什么方面的知识?有什么比较好的书吗?
- 小弟要做网络数据实时传输,想要边压缩边发送,哪位做过数据压缩的大侠帮帮忙,提点提点!有什么库什么的可以用的?LZW效率太低,想用zip
- 请问Visual C++ 6 宝典,这本书怎么样?
- 那位高人知道 Windows 下有没有输入、输出重定向啊?
- 基于MFC的SOCKET中C/S模式通信,如何实现心跳机制?
- 提示使用了未定义的对话框类!
- 写了一个计算器组件,客户端写了一个接收器,为什么VARIANT类型的参数传递不过来?
ATL 中的编码操作包含在 <atlenc.h> 中
CString是版本相关的,使用基本的数据类型作为参数来进行编码处理:char 和 WCHAR