wldellstar 2024-01-07 14:28 采纳率: 100%
浏览 4
已结题

如何在头文件中引用了#include "afxinet.h"使用的是MFC编程连接ftp后显示的中文是乱码?

如何解决vc6.0编写的ftp客户端,出现中文为乱码的问题?

在头文件中引用了#include "afxinet.h"
使用的是MFC编程
连接ftp后显示的中文是乱码:

img


请问大师怎么解决?

    char * pOldLocale = _strdup(setlocale(LC_CTYPE, NULL));
    if(m_check_utf8 == true)
    {
        //setlocale(LC_CTYPE, "zh_CN.UTF-8");LC_ALL,"Chinese-simplified"
        setlocale(LC_CTYPE, "zh_CN.UTF-8");
    }
    BYTE nFild[4];
    ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
    CString sip;
    sip.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);
    CString strusr = m_ftpuser;
    CString strpwd =m_ftppassword;
    if (sip.IsEmpty())
    {
        AfxMessageBox(_T("IP地址为空!"));
        return;
    }
    if (strport.IsEmpty())
    {
        AfxMessageBox(_T("端口号为空!"));
        return;
    }
    if (strusr.IsEmpty())
    {
        return;
    }
    //建立一个Internet会话
    pInternetSession= new CInternetSession("MR",INTERNET_OPEN_TYPE_PRECONFIG);

    try
    {
    //利用Internet会话对象pInternetSession打开一个FTP连接
        pFtpConnection=pInternetSession->GetFtpConnection(sip,strusr,strpwd,atoi(strport));
        bconnect=true;
    }
    catch (CInternetException* pEx)
    {
        TCHAR szErr[1024];
        pEx->GetErrorMessage(szErr,1024);
        AfxMessageBox(szErr);
        pEx->Delete();
    }
    if(m_check_utf8 == true)
    {
        setlocale(LC_CTYPE, pOldLocale);
        free(pOldLocale);
    }

}

    CFtpFileFind ftpfind(pFtpConnection);
    //找到第一个文件或者文件夹,通过CFtpFileFind::FindFile实现
    BOOL bfind=ftpfind.FindFile(NULL);
    
    //unicode宽字符转 UTF8
    //char wbuff2[40001];
    //wi = WideCharToMultiByte(CP_UTF8, NULL,(LPCWCH)wbuff, -1, wbuff2, 4000, 0, 0);
    //wbuff2[wi] = 0;
    //if (wi == 0)
    //MessageBox("error 文件名转换成UTF8不成功");csdisplay +="error 文件名转换成UTF8不成功rin"!goto WOUT;
    int count = 0;
    m_list_ftpfile.DeleteAllItems();
    while (bfind)
    {
        bfind=ftpfind.FindNextFile();
        CString strpath;
        if (!ftpfind.IsDirectory())//判断是目录还是文件夹
        {
            strpath=ftpfind.GetFileName();//是文件则读取文件名
            CTime lasttime;
            ftpfind.GetLastWriteTime(lasttime);
            CString t = lasttime.Format("%c");
            
            count = m_list_ftpfile.GetItemCount();
            m_list_ftpfile.InsertItem(count ,"");
            m_list_ftpfile.SetItemText(count, 0 , strpath);
            m_list_ftpfile.SetItemText(count, 1 , t);
        }
        else{
            strpath=ftpfind.GetFilePath();//如果是文件夹则获取相对路径
            CTime lasttime;
            ftpfind.GetLastWriteTime(lasttime);
            CString t = lasttime.Format("%c");
            count = m_list_ftpfile.GetItemCount();
            m_list_ftpfile.InsertItem(count ,"");
            m_list_ftpfile.SetItemText(count, 0 , strpath);
            m_list_ftpfile.SetItemText(count, 1 , t);
            m_message = m_message + strpath;
        }
    }
    UpdateData(false);
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-07 16:20
    关注

    【以下回答由 GPT 生成】

    这个问题涉及到MFC编程中FTP连接后中文乱码的解决方法。根据提供的代码和问题描述,我可以给出以下解决方案:

    首先,可以尝试在建立Internet会话之前,设置全局的字符集为UTF-8。具体做法是在setlocale(LC_CTYPE, "zh_CN.UTF-8");之前添加以下代码:

    setlocale(LC_ALL, ".UTF8");
    _setmbcp(_MB_CP_UTF8);
    

    接下来,在建立FTP连接之前,将字符集设置为默认的字符集,以防止对FTP服务器造成影响。添加以下代码:

    _putch('n'); // 这行代码和下一行代码组合起来是为了恢复到默认的字符集
    setlocale(LC_CTYPE, ""); // 将字符集设置为默认的字符集
    

    最后,在FTP连接建立之后,可以将字符集重新设置为原来的字符集。添加以下代码:

    setlocale(LC_CTYPE, pOldLocale);
    free(pOldLocale);
    

    整体的代码如下所示:

    char * pOldLocale = _strdup(setlocale(LC_CTYPE, NULL));
    if(m_check_utf8 == true)
    {
        setlocale(LC_ALL, ".UTF8");
        _setmbcp(_MB_CP_UTF8);
        setlocale(LC_CTYPE, "zh_CN.UTF-8");
    }
    // 其他代码
    _putch('n');
    setlocale(LC_CTYPE, "");
    // 其他代码
    setlocale(LC_CTYPE, pOldLocale);
    free(pOldLocale);
    

    这样做的目的是在建立FTP连接之前将字符集设置为UTF-8,使得进行FTP操作时能够正确地处理中文字符。然后在连接建立之后将字符集恢复为原来的字符集,以避免对其他操作造成影响。

    希望这个解决方案对你有帮助。如果有任何疑问,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 soildworks装配体的尺寸问题
  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑