在 VC6 编译器中打开包含 Unicode 字符的文件名

Posted

技术标签:

【中文标题】在 VC6 编译器中打开包含 Unicode 字符的文件名【英文标题】:opening filename containing Unicode characters in VC6 compiler 【发布时间】:2014-09-16 03:31:36 【问题描述】:

我们有一个基于 VC6 编译器的维护项目。在代码的某些部分,我们有一个使用 ifstream.open() 方法的文件打开函数,当文件名包含中文字符等 UNICODE 字符时,该函数会失败。由于 VC6 编译器不支持 wchar_t* 版本的 open 函数,有没有办法可以打开这种类型的文件?我也尝试了 FILE* _wfopen 方法,但它也失败了。

提前致谢

根据 RemyLebeau 的指导 - 我尝试使用 errno,我得到的值为 22,表示参数无效。请看我的代码 std::wstring 文件名=_wgetenv(L"IVT_FILENAME"); 文件*流; 流=_wfopen(filename.c_str(),L"r");

这在 vc9 中工作得非常好,文件打开并且我能够读取内容。不知道为什么它在vc6中不起作用。 stream的值为NULL

【问题讨论】:

声明它是一个限制并继续前进。 支持Visual Studio 6.0 _wfopen: msdn.microsoft.com/en-us/library/aa246392(v=vs.60).aspx 它确实支持 _wfopen 但它无法打开包含 unicode 字符的文件名并为 FILE* 对象返回 null。 GetLastError 返回代码 123- 未找到文件名。当我将相同的代码复制粘贴到 Visual Studio 8.0 时,它会顺利通过 如果_wfopen() 失败并说找不到文件,那么要么确实找不到文件(更有可能),要么_wfopen() 本身有错误(不太可能)。仔细检查您输入的 Unicode 数据以确保它是正确的。顺便说一句,如果你read the documentation,_wfopen() 不使用GetLastError() 进行错误报告,它会使用errno @RemyLebeau:我确实检查了文件的存在。该文件非常存在。此外,当我将相同的代码复制粘贴到 VC9 时,文件打开时没有任何问题。所以我怀疑这与VC6有关。 【参考方案1】:

实际的问题在于 _wgetenv 函数。它在 VC6 编译器中无法正常工作。用 GetEnvironmentVariable 替换它可以解决问题并打开文件

【讨论】:

调试器怎么可能不显示这个?我怀疑您是否找到了真正的问题,必须同时维护 getenv() 和 _wgetenv() 是一个棘手的问题。使用 GetEnvironmentVariable 是针对损坏的 8 位环境副本的解决方法。

以上是关于在 VC6 编译器中打开包含 Unicode 字符的文件名的主要内容,如果未能解决你的问题,请参考以下文章

vc6开发环境由MBCS改成UNICODE

VC6:致命错误 C1083:无法打开包含文件:“stdint.h”

vs2010 编译多个project问题

如何打开/ Python中转换CSV这样的字符串不是Unicode?

关于Code Blocks无编译器版本及VC6.0插入打开报错

VC++ 6.0当中,CString和string这两种类型有啥区别?