解决InternetReadFile下载带有中文字符的文件失败的方案
如下代码:
// HttpDownFileDemo.cpp : 定义控制台应用程序的入口点。
//这是一个Http下载文件的例子
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>
#include <Nb30.h>
#include <wininet.h>
#pragma comment(lib, "Wininet.lib")
#pragma comment(lib, "NetApi32.lib") //初始化
HANDLE InitHttpRequest(LPCTSTR pszFile);
//写入文件
void WriteFileBuffer(HANDLE File,char *pBuff, DWORD dwLen);//入口函数
int _tmain(int argc, _TCHAR* argv[])
{//文件句柄HANDLE m_hFile;//本地文件路径TCHAR szLocalFile[MAX_PATH];//初始化ZeroMemory(szLocalFile,sizeof(szLocalFile));//本地路径lstrcpyn(szLocalFile,TEXT("C:\\按钮.png"),sizeof(szLocalFile));//初始化本地文件m_hFile = InitHttpRequest(szLocalFile);//初始化HINTERNET hSession = InternetOpen(TEXT("UrlTest"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
//下载路径std::string strRequestFileGBK = "http://183.131.195.49:81//GameClient//res/GamePlaza/Face/按钮.png";//打开文件HINTERNET hHttp = InternetOpenUrlA(hSession, strRequestFileGBK.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if(hHttp){char Temp[1024]; ULONG Number = 1;while (Number > 0){BOOL bReadFile = InternetReadFile(hHttp, Temp, 1024 - 1, &Number);if(bReadFile == FALSE){cout << "文件下载异常,错误Code:" << GetLastError() << endl;break;}//写入数据WriteFileBuffer(m_hFile,Temp, Number); }InternetCloseHandle(hHttp);InternetCloseHandle(hSession);}else{cout << "文件打开异常,错误Code:" << GetLastError() << endl;InternetCloseHandle(hSession);}//关闭文件if (m_hFile){CloseHandle(m_hFile);m_hFile = NULL;}system("pause");return 0;
}//写入数据
void WriteFileBuffer(HANDLE File,char *pBuff, DWORD dwLen)
{if (dwLen<=0)return;WriteFile(File, pBuff, dwLen, &dwLen, NULL);
}//初始化请求
HANDLE InitHttpRequest(LPCTSTR pszFile)
{HANDLE File = CreateFile(pszFile, GENERIC_READ|GENERIC_WRITE,//允许读写该文件0,NULL,OPEN_ALWAYS,//如果存在就打开文件,否则创建FILE_ATTRIBUTE_NORMAL,NULL);if (File==INVALID_HANDLE_VALUE)return File;DWORD dwFileCurrySize = GetFileSize(File, NULL) ; if (dwFileCurrySize == -1)return File;SetFilePointer(File, 0,0,FILE_END);return File;
}
上面这个Demo程序下载一般的文件是没有问题的,唯独下载带有中文字符的文件会出现下载失败的问题,如下图:
最终读取到的内容会提示“找不到文件或目录”,也就会导致下载失败,解决这个问题也很简单,如下代码:
增加一个GBK转UTF8的方法:
//GBK转UTF8
string GBKToUTF8(const std::string& strGBK)
{string strOutUTF8 = "";WCHAR * str1;int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);str1 = new WCHAR[n];MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);char * str2 = new char[n];WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);strOutUTF8 = str2;delete[]str1;str1 = NULL;delete[]str2;str2 = NULL;return strOutUTF8;
}
再将红色背景代码块替换为:
//下载路径std::string strRequestFileGBK = "http://183.131.195.49:81//GameClient//res/GamePlaza/Face/按钮.png";//GBK转UTF8std::string strRequestFileUTF8 = GBKToUTF8(strRequestFileGBK);//打开文件HINTERNET hHttp = InternetOpenUrlA(hSession, strRequestFileUTF8.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
再次下载问题得到解决,只要将要打开的地址从GBK转换为UTF8,再使用InternetOpenUrlA打开,就没有问题了。
点击下载工程代码(VS2010)
解决InternetReadFile下载带有中文字符的文件失败的方案相关推荐
- 中文提交到git乱码_解决git 提交后中文字符会乱码的问题
解决git 提交后中文字符会乱码的问题 最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitla ...
- 解决Python3中的中文字符编码的问题-亲测有效
解决Python3中的中文字符编码的问题 一.原理篇: Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等.这篇文章主要介绍了Python3中的解决中文字符编 ...
- Response响应字符数据(解决乱码问题),字符数据(文件输出)
Response响应字符数据(解决乱码问题),字符数据(文件输出) Request:使用request对象来获取请求数据 Response:使用response对象来设置响应数据 Reponse的继承 ...
- Ogre读取中文路径名的文件失败的解决办法
Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的. 因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法: 打开OgreFileSyst ...
- Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...
原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...
- unity 解决乱码_Unity3D脚本中文字符乱码的解决方案
用Unity这么久,一直就听别人说遇到在脚本里面用中文字符会乱码的问题.这些问题在Visual Studio比较少,通常都是在MonoDevelop上会出现,甚至在Monodevelop编辑器,写了中 ...
- sqlite3打开中文路径数据文件失败解决方法
今天用sqlite3访问中文路径的数据库文件,发现sqlite3_open函数返回失败,问度娘后,有网友建议sqlite3_open16打开,sqlite3_open16和sqlite3_open区别 ...
- 解决读取数据库里面中文字符乱码的问题
最近做项目过程中要从数据库中读取一些字段,将这些字段先用实体类封装好,然后在其他java主程序中调用该字段进行匹配,奈何我操作了好几遍,总是显示数据库中中文字符乱码.数据库中样式如图1所示. 图1 数 ...
- cad2006激活未找到html文件,解决cad提示“cad加载自定义文件失败 未找到acad”的方法...
下图所示的提示界面大家是不是觉得很熟悉呢?这个错误提示是出现在autocad程序中的错误之一.相比无法安装等情况这个故障的解决方法比较简单,首先我们来看看具体故障:有用户在双击打开Autocad的时候 ...
最新文章
- php组合设计模式(composite pattern)
- vscode配置、使用git
- wxWidgets事件处理(手机播放器连载系列2)
- 16、Flutter Widget - PageView;
- LNMP详解(十四)——Nginx日志详解
- spark配置lzo
- 【MPI0】学习资料搜集
- python 数据挖掘与分析实战
- 鸿蒙策略炒股软件安全么,鸿蒙即将全量开源 引爆国产软件板块!
- 基于数据驱动的故障检测(一)
- linux中的xorg进程占用内存资源释放
- 《黃帝內經》第一章《上古天真論》
- C语言整除、取余运算的符号问题
- 计算机与文秘专业有哪些课程,文秘专业开设的课程有哪些
- Eclipse开发工具的使用
- 三星手机开不了机了,一直是开机界面但是进不去
- 空气型母线槽和密集型(封闭式)母线槽的区别
- 【Idea技巧】02.Idea包进行展开
- Slackware 14.1 安装后记
- php中的explode的作用,php explode用法是什么
热门文章
- 文字和页面特效——实现火焰文字
- Qt开发(三) Qt调试运行提示::-1: error: cannot open output file debug\untitled.exe: Permission denied
- ansible中role角色的应用
- JavaScript——网页轮播图( 实现点击小圆点、图片滑动、小圆点样式改变)
- lan和adsl是什么信号_宽带(ADSL)和宽带(LAN)都分别是什么意思??
- JLinkGDBServer调试ARM linux内核
- 用Think Pad 系统升级程序ThinkVantage System Update时候提示 无法连接代理服务器 的解决办法...
- 计算机系统属性更改是灰色的,文件夹隐藏属性变灰色无法更改的原因及解决方法...
- Linux 设置双网卡通信,外网网卡和内网网卡
- 使用Tensorflow模仿HearthArena炉石卡片排名算法