发送含中文url,服务器接收到乱码问题

baidu_29905333 2016-02-04 11:28:21
现在用MFC做一个客户端程序,功能大概是:客户端发送"GET"请求(假设为"http://100.100.100.100:8080/publish/statistic.shtml?guid=0A938E29-2203-506X-BCD7-FDCFE0187EA3&name=测试&version=v1.0"),服务器(Java)接收到后解析url,提取guid、name和version的值。
现在遇到一个问题是,如果url全是英文,那么服务器收到的是正常的。如果url包含了中文(例如上面name的值“测试”),那么服务器接收到的就是乱码,而其他英文的值是正常的。
请问怎么解决?
PS:MFC项目设置里,字符集是“使用多字节字符集”(也就是LPTSTR = char*)由于一些原因不能用Unicode。
...全文
717 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
旅行着 2016-05-10
  • 打赏
  • 举报
回复
中文转码或加密
老王爱上猫 2016-05-10
  • 打赏
  • 举报
回复
base64
a200594150 2016-03-17
  • 打赏
  • 举报
回复
char* ConvertGB2312toUTF8(const char *pData) { int len = MultiByteToWideChar(CP_ACP, 0, pData, -1, NULL, 0); wchar_t* wstr = new wchar_t[len+1]; memset(wstr, 0, len+1); MultiByteToWideChar(CP_ACP, 0, pData, -1, wstr, len); len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); char* str = new char[len+1]; memset(str, 0, len+1); WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL); if(wstr) delete[] wstr; return str; }
luawkk 2016-03-17
  • 打赏
  • 举报
回复
转换编码啊,好像有URLcode 我记得
hurryboylqs 2016-03-17
  • 打赏
  • 举报
回复
utf-8编码的百分号形式,常叫urlencode
fungaren 2016-02-06
  • 打赏
  • 举报
回复
m_edit 指文本框关联的值,类型为CString。目前CString是宽字符。 发送和接收时进行ANSI-UNICODE转换即可。需要用到转换宏A2W()和W2A()。

void CMyDlg::OnBnClickedSend()
{
	// TODO:  在此添加控件通知处理程序代码
	USES_CONVERSION;	// 信息交换使用ANSI
	UpdateData(TRUE);
	if (SOCKET_ERROR == client.Send(W2A(m_edit), m_edit.GetLength(), NULL))
		return;
}

	case RECV:
	{
		char t[1024] = { 0 };
		UpdateData(TRUE);

		USES_CONVERSION;	// 信息交换使用ANSI

		while (s->Receive(t, 1024, NULL))
			m_edit += A2W(t);

		UpdateData(FALSE);
		break;
	}
赵4老师 2016-02-04
  • 打赏
  • 举报
回复
搜“URLEncode”
蒋晟 2016-02-04
  • 打赏
  • 举报
回复
使用UTF-8编码URL
赵4老师 2016-02-04
  • 打赏
  • 举报
回复
// UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所
// 有文字和符号种类加起来也只要编到 4个字节长就够了。
//   UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一
// 点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字
// 节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这
// 些连续“1”称为标记位),表示转换成几个字节:“110”连续两个
// “1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”
// 则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和
// 字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标
// 记,剩下的6个位才做为字符码位使用。
//   这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的
// 原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字
// 符码,由此类推。编码方式的模板如下:
//
// 原始码(16进制) UTF-8编码(二进制)
// --------------------------------------------
// 0000 - 007F       0xxxxxxx
// 0080 - 07FF       110xxxxx 10xxxxxx
// 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx
// ……
// --------------------------------------------
//
//   模板中的“x”表示字符码。
//   Ascii码<007F,编为1个
// 字节的UTF-8码。汉字的 Unicode编码范围为0800-FFFF,所以被编为
// 3个字节的UTF-8码。
//   例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以
// 要用3个字节的模板:1110wwww 10xxxxyy 10yyzzzz。

//    6    C    4    9
// 0110 1100 0100 1001
// wwww xxxx yyyy zzzz
//     wwww   xxxxyy   yyzzzz
// 1110wwww 10xxxxyy 10yyzzzz。
// 11100110 10110001 10001001
//    E   6    B   1    8   9
//“汉”字的UTF-8编码是E6 B1 89
baidu_29905333 2016-02-04
  • 打赏
  • 举报
回复
引用 1 楼 jiangsheng 的回复:
使用UTF-8编码URL
是将完整 http://100.100.100.100:8080/publish/statistic.shtml?guid=0A938E29-2203-506X-BCD7-FDCFE0187EA3&name=测试&version=v1.0 整串进行utf-8编码吗?其中的中文要不要额外编码?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧