我用如下代码下载一个XML文件
XML的编码是 UTF-16LE
当我的工程是unicode时
我下回来的文件总是不能正确的截断
代码如下:BOOL DownLoadFileToMem(CString szUrl, CString& mem)
{
HINTERNET internet=InternetOpen(_T("HTTP Downloader"), INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, NULL);
if(internet == NULL) return FALSE;
DWORD dwSize; TCHAR szHead[] = _T("Accept: */*\r\n\r\n");
TCHAR szTemp[1024]; //szTemp[500];
HINTERNET hConnect = NULL;
BOOL result = FALSE; if ( !(hConnect = InternetOpenUrl ( internet, szUrl, szHead,
lstrlen (szHead), INTERNET_FLAG_DONT_CACHE, 0)))
{
goto cleanup;
}
do
{
// Keep coping in 25 bytes chunks, while file has any data left.
// Note: bigger buffer will greatly improve performance.
if (!InternetReadFile (hConnect, szTemp, 1023, &dwSize) )
{
goto cleanup;
}
if (!dwSize)
break; // Condition of dwSize=0 indicate EOF. Stop.
else
{
//if (dwSize<)
//{
//}
szTemp[dwSize] = 0x0000;//=NULL也不行
mem += szTemp;
MessageBox(NULL,szTemp,NULL,MB_OK);
ZeroMemory(szTemp,1024);
}
result = TRUE;
}
while (TRUE);
cleanup:
if(hConnect)
InternetCloseHandle(hConnect); return result;
}
但是当xml文件的格式是ansi 而且我的工程是多字节时候 只要szTemp[dwSize] = '\0';
一切正常了。
不要说 那就用ansi贝。
不想用ansi
XML的编码是 UTF-16LE
当我的工程是unicode时
我下回来的文件总是不能正确的截断
代码如下:BOOL DownLoadFileToMem(CString szUrl, CString& mem)
{
HINTERNET internet=InternetOpen(_T("HTTP Downloader"), INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, NULL);
if(internet == NULL) return FALSE;
DWORD dwSize; TCHAR szHead[] = _T("Accept: */*\r\n\r\n");
TCHAR szTemp[1024]; //szTemp[500];
HINTERNET hConnect = NULL;
BOOL result = FALSE; if ( !(hConnect = InternetOpenUrl ( internet, szUrl, szHead,
lstrlen (szHead), INTERNET_FLAG_DONT_CACHE, 0)))
{
goto cleanup;
}
do
{
// Keep coping in 25 bytes chunks, while file has any data left.
// Note: bigger buffer will greatly improve performance.
if (!InternetReadFile (hConnect, szTemp, 1023, &dwSize) )
{
goto cleanup;
}
if (!dwSize)
break; // Condition of dwSize=0 indicate EOF. Stop.
else
{
//if (dwSize<)
//{
//}
szTemp[dwSize] = 0x0000;//=NULL也不行
mem += szTemp;
MessageBox(NULL,szTemp,NULL,MB_OK);
ZeroMemory(szTemp,1024);
}
result = TRUE;
}
while (TRUE);
cleanup:
if(hConnect)
InternetCloseHandle(hConnect); return result;
}
但是当xml文件的格式是ansi 而且我的工程是多字节时候 只要szTemp[dwSize] = '\0';
一切正常了。
不要说 那就用ansi贝。
不想用ansi
// ansi字符串转unicode字符串
// 返回大于0成功,小于0失败
//**************************************
int
astr_ustr( char *ansistr, WCHAR *unicodestr )
{
int result = 0;
try
{
//size_t len = strlen( ansistr );
int needlen = MultiByteToWideChar( CP_ACP, 0, ansistr, -1, NULL, 0 );
if( needlen < 0 )
{
return needlen;
} result = MultiByteToWideChar( CP_ACP, 0, ansistr, -1, unicodestr, needlen + 1 );
if( result < 0 )
{
return result;
}
return wcslen( unicodestr );
}
catch( ... )
{
ShowError();
}
return result;
}
XML也是unicode编码
BOOL DownLoadFileToMem(CString szUrl, CString& mem)
{
HINTERNET internet=InternetOpen(_T("HTTP Downloader"), INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, NULL);
if(internet == NULL) return FALSE;
DWORD dwSize; TCHAR szHead[] = _T("Accept: */*\r\n\r\n");
TCHAR szTemp[1024]; //szTemp[500];
HINTERNET hConnect = NULL;
BOOL result = FALSE; if ( !(hConnect = InternetOpenUrl ( internet, szUrl, szHead,
lstrlen (szHead), INTERNET_FLAG_DONT_CACHE, 0)))
{
goto cleanup;
}
do
{
// Keep coping in 25 bytes chunks, while file has any data left.
// Note: bigger buffer will greatly improve performance.
if (!InternetReadFile (hConnect, szTemp, sizeof(szTemp)/sizeof(TCHAR)-sizeof(TCHAR), &dwSize) )
{
goto cleanup;
}
if (!dwSize)
break; // Condition of dwSize=0 indicate EOF. Stop.
else
{
//if (dwSize<)
//{
//}
szTemp[dwSize/sizeof(TCHAR)] = NULL;//=NULL也不行
mem += szTemp;
MessageBox(NULL,szTemp,NULL,MB_OK);
ZeroMemory(szTemp,sizeof(szTemp));
}
result = TRUE;
}
while (TRUE);
cleanup:
if(hConnect)
InternetCloseHandle(hConnect); return result;
}
已解决 通用于ansi unicode