如下代码:

// 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下载带有中文字符的文件失败的方案相关推荐

  1. 中文提交到git乱码_解决git 提交后中文字符会乱码的问题

    解决git 提交后中文字符会乱码的问题 最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitla ...

  2. 解决Python3中的中文字符编码的问题-亲测有效

    解决Python3中的中文字符编码的问题 一.原理篇: Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等.这篇文章主要介绍了Python3中的解决中文字符编 ...

  3. Response响应字符数据(解决乱码问题),字符数据(文件输出)

    Response响应字符数据(解决乱码问题),字符数据(文件输出) Request:使用request对象来获取请求数据 Response:使用response对象来设置响应数据 Reponse的继承 ...

  4. Ogre读取中文路径名的文件失败的解决办法

    Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的. 因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法: 打开OgreFileSyst ...

  5. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  6. unity 解决乱码_Unity3D脚本中文字符乱码的解决方案

    用Unity这么久,一直就听别人说遇到在脚本里面用中文字符会乱码的问题.这些问题在Visual Studio比较少,通常都是在MonoDevelop上会出现,甚至在Monodevelop编辑器,写了中 ...

  7. sqlite3打开中文路径数据文件失败解决方法

    今天用sqlite3访问中文路径的数据库文件,发现sqlite3_open函数返回失败,问度娘后,有网友建议sqlite3_open16打开,sqlite3_open16和sqlite3_open区别 ...

  8. 解决读取数据库里面中文字符乱码的问题

    最近做项目过程中要从数据库中读取一些字段,将这些字段先用实体类封装好,然后在其他java主程序中调用该字段进行匹配,奈何我操作了好几遍,总是显示数据库中中文字符乱码.数据库中样式如图1所示. 图1 数 ...

  9. cad2006激活未找到html文件,解决cad提示“cad加载自定义文件失败 未找到acad”的方法...

    下图所示的提示界面大家是不是觉得很熟悉呢?这个错误提示是出现在autocad程序中的错误之一.相比无法安装等情况这个故障的解决方法比较简单,首先我们来看看具体故障:有用户在双击打开Autocad的时候 ...

最新文章

  1. linux文件夹加密访问,技术|Linux系统上用encfs创建和管理加密文件夹
  2. 深度学习:卷积层的实现
  3. django settings 定义的变量不存在_使用Django部署机器学习模型(1)
  4. 设置ntpdate服务开机启动校验时间
  5. 数据分析领域七大热门职业
  6. 编译静态expect现undefined reference to `openpty' 错误解决方法
  7. 虚拟机环境+Hadoop环境搭建
  8. 2022年最新山西机动车签字授权人模拟试题及答案
  9. JsessionId简介与过滤
  10. win10如何共享计算机网络打印机,win10如何共享打印机给其它电脑,Win10设置打印机共享操作步骤...
  11. docker---dockerfile 编写优化
  12. centos7随机生成密码
  13. gps校正 android,通过GPS时间同步Android设备?
  14. php网站系统说明,PHP电影网站系统光线CMS(GXCMS)模板制作标签说明
  15. 关于个人网贷查询系统网贷信用查询,公司开发图片整合技术
  16. 光遇服务器修复暴风眼刷新了吗,光遇暴风眼怎么进 光遇暴风眼刷新时间
  17. D3 二维图表的绘制系列(二十三)旭日图
  18. 记录一次公司点星PBX(DotAsterisk) 映射外网后外部SIP分机注册拨通无声音的故障解决方法
  19. Certificate 超详细解析cer证书(序列号,颁发者,公钥等)
  20. [Java]JDK1.7中HashMap的并发死链

热门文章

  1. 软件逆向工程:破解教程(1/24)
  2. MQTT.fx 接入教程(MQTT客户端)
  3. DirectoryInfo遍历文件及文件夹
  4. 绕过讯雷邻居的合谐教程.txt
  5. php结合美图秀秀,美图秀秀web开放平台--PHP流式上传和表单上传示例分享_PHP
  6. 万千家长的疑问 [益智玩具]大曝光
  7. php不四舍五入取整,php四舍五入与取整
  8. iOS中实现打电话、发短信
  9. C语言——函数调用(实参与形参)
  10. 【论文理解】On Episodes, Prototypical Networks, and Few-shot Learning