用mfc写个程序,访问FTP路径,ftp服务端设置的字符编码为UTF-8,我用CFtpFileFind类下面的getfilename()获取到目录下的文件名(中文),然后用MultiByteToWideChar把utf-8编码的字符转为Unicode,但是发现一部分中文可以正确的转过来,可还有一部分中文显示为问号求大神指导

解决方案 »

  1.   

    CFtpFileFind finder(m_pFtpConnection);CString strFileName = _T("");
    strFileName = finder.GetFileName();
    USES_CONVERSION;
    char* pFileName = T2A(strFileName);
    CharArrayToCString(pFileName, strFileName,CP_UTF8);
    void CSelFtpDirDlg::CharArrayToCString(const char* pChar, CString& str, int encodeType)
    {
    if(pChar != NULL)
    {
    size_t len = strlen(pChar);
    size_t wcharCount =(size_t)MultiByteToWideChar(encodeType, 0, (const char *)pChar, len, NULL, 0); USES_CONVERSION;
    WCHAR*  szTemp = new WCHAR[wcharCount + 1];
    szTemp[wcharCount] = 0;
    MultiByteToWideChar(encodeType, 0, (const char *)pChar, (int)len, szTemp, (int)wcharCount);

    char* pmtStr = W2A(szTemp);
    str = (CString)pmtStr;
    str = str.Left( len);
    delete []szTemp;
    }
    }
      

  2.   

    str = str.Left( len); 这是为什么?  屏蔽了看看
      

  3.   

    这里写的多余了,whar直接转cstring也一样。问题应该是出现在getfilename()这里了,这时候获取的值以及不是完整的UTF8编码的了
      

  4.   

    可以使用多字节方式编译, 仅需 MultiByteToWideChar(CP_UTF8 一次转换到UNICODE字符应该就可以了我看网上都是 发送 OPTS UTF8 OFF 命令处理的
      

  5.   

    我之前也试过用多字节方式编译,结果也一样,因为FTP服务端是linux上,要求必须utf8。我最后是没有用MFC的CFileFind类。出现这个问题的原因应该就是getfilename这里返回的UTF8编码的内容就有问题
      

  6.   

    我之前遇到过,多字节转换成UTF-8,好像不能直接使用一次MultiByteTOWideChar就行了,转换后还需要进行一次
    WideCharToMultiByte转换到UTF-8,好像是这样。