MFC工程使用多字节字符集打开文件失败。使用Unicode字符集正常

小草sd 2018-08-20 09:13:51
文件名:D:\S SL A.GBR

工程使用多字节字符集
CFileDialog dlg(TRUE);
CString fn=dlg.GetPathName();//fn获取的二进制码如下
//char sm[128]={'D',':','\\','S',63,'S','L',63,'A','.','G','B','R'};//使用多字节字符集
FILE *fp=fopen(fn.GetBuffer(),"rb"); 打开文件失败

使用Unicode字符集
CString fn=dlg.GetPathName();//fn获取的二进制码如下
//wchar_t sm2[128]={L'D',L':',L'\\',L'S',160,L'S',L'L',160,L'A',L'.',L'G',L'B',L'R'};//使用Unicode字符集
FILE *fp=_wfopen(fn.GetBuffer(),L"rb"); 打开文件成功

我的工程是多字节字符集,需要打开这个文件,
字符集转换,试了好久也没用成功打开文件。
大神们帮帮忙! 这个情况遇到好几次了。
自己做的中文文件名,都可以打开,
客户这个文件名不知道如何产生的。
多谢多谢!
...全文
378 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2018-08-21
  • 打赏
  • 举报
回复
主要是含空格文件名如何打开吧,我没遇到过奇葩,
zgl7903 2018-08-21
  • 打赏
  • 举报
回复
UNICODE 要转多字节 必须要正确的代码页, 如果文件名是混合代码页的 很难正确转换
可以考虑先记录好原始文件名, 然后用MoveFileW把文件名修改为纯ASC码字符,就可以fopen操作了, 完了MoveFile再改回来
小草sd 2018-08-20
  • 打赏
  • 举报
回复
MFC只用做界面,其他模块一直用char*文件名,fopen打开
引用 2 楼 jiangsheng 的回复:
fopen不支持中文路径

既然用了MFC为啥不用CFile?
小草sd 2018-08-20
  • 打赏
  • 举报
回复
中文路径是可以的啊,亲测,多字节字符集下
引用 2 楼 jiangsheng 的回复:
fopen不支持中文路径

既然用了MFC为啥不用CFile?
小草sd 2018-08-20
  • 打赏
  • 举报
回复
非常好的方法。 但是这里获取的文件名,用_wfopen可以打开, 如果我还想用c语言的fopen,要转换字符编码?我一直没有转换对,软件内所有地方以前都用fopen,都要改成_wfopen? 我希望保留fopen,要怎么办? 大神?
引用 1 楼 zgl7903 的回复:
直接用 GetOpenFileNameW

LPCWSTR wszFilter = L"Images(*.BMP,*.DIB)\0*.BMP;*.DIB\0All Files(*.*)\0*.*\0\0";
WCHAR wszFile[MAX_PATH + 1] = {0};

OPENFILENAMEW OpenFileNameW = {0}; // Structure for common dialog File/Open
OpenFileNameW.lStructSize = sizeof(OpenFileNameW);
OpenFileNameW.hwndOwner = m_hWnd;
OpenFileNameW.hInstance = AfxGetInstanceHandle();
OpenFileNameW.lpstrFilter = wszFilter;
OpenFileNameW.lpstrFile = wszFile;
OpenFileNameW.nMaxFile = MAX_PATH;
OpenFileNameW.lpstrTitle = L"Open Image";
OpenFileNameW.Flags = OFN_EXPLORER | OFN_LONGNAMES;
if (GetOpenFileNameW(&OpenFileNameW))
{
OutputDebugStringW(OpenFileNameW.lpstrFile);
OutputDebugStringW(L"\r\n");
}
蒋晟 2018-08-20
  • 打赏
  • 举报
回复
fopen不支持中文路径

既然用了MFC为啥不用CFile?
zgl7903 2018-08-20
  • 打赏
  • 举报
回复
直接用 GetOpenFileNameW

LPCWSTR wszFilter = L"Images(*.BMP,*.DIB)\0*.BMP;*.DIB\0All Files(*.*)\0*.*\0\0";
WCHAR wszFile[MAX_PATH + 1] = {0};

OPENFILENAMEW OpenFileNameW = {0}; // Structure for common dialog File/Open
OpenFileNameW.lStructSize = sizeof(OpenFileNameW);
OpenFileNameW.hwndOwner = m_hWnd;
OpenFileNameW.hInstance = AfxGetInstanceHandle();
OpenFileNameW.lpstrFilter = wszFilter;
OpenFileNameW.lpstrFile = wszFile;
OpenFileNameW.nMaxFile = MAX_PATH;
OpenFileNameW.lpstrTitle = L"Open Image";
OpenFileNameW.Flags = OFN_EXPLORER | OFN_LONGNAMES;
if (GetOpenFileNameW(&OpenFileNameW))
{
OutputDebugStringW(OpenFileNameW.lpstrFile);
OutputDebugStringW(L"\r\n");
}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧