我用如下代码下载一个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

解决方案 »

  1.   

    再用multichartowidechar就行了。
      

  2.   

    //**************************************
    // 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;
    }
      

  3.   

    是文件不能正确的截断 不是什么charto什么char的问题
    XML也是unicode编码
      

  4.   


    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
      

  5.   

    Unicode每个字符是两个字节,你读单数个字节的时候就把一个字符给分成两半了,每次都读偶数个字节就没问题了。