一位客户抱怨说,我们的代码用于在文件名中使用日文字符编写文件,但不再适用于所有情况。我们总是使用好的旧char *字符串来表示文件名,所以它对我来说有点令人震惊,它曾经起作用,而且我没有做任何我知道应该使它停止工作的事情。我让他们向我发送一个带有嵌入文件名的文件,并将它从我们的软件中导出,它看起来像字符串使用十六进制字符82和83作为双字节序列的第一个字符来表示日文字符。在网上搜索引导我相信这可能是SHIFT_JIS和/或Windows代码页932.Windows Codepage与标准C/C++文件名的交互作用?
它看起来像我以前发生的事情是既fopen和ofstream ::打开接受的文件名使用此代码页;现在只有fopen。我已经检查过Visual Studio fopen文档,并且我没有看到什么让一个可接受的字符串传递给fopen。
在短期内,我希望有人可以对特定的Windows fopen和ofstream :: open问题提供一些启示。从长远来看,我真的很想知道开放统一的接受的方式在C++中的文件名,在Windows,Linux和OS X.
编辑补充(及其他):我认为,将打开工作是在“C”语言环境中完成的,而不工作的是在客户的默认语言环境中完成的。然而,这种情况多年来一直如此,而且该计划的旧版本今天仍然适用于他们的系统,所以这对于解释我们所看到的问题来说似乎是一个长远的目标。
更新:我发送了一个小测试程序给客户。它已经证实fopen可以正确使用SHIFT_JIS文件名,并且std :: ofstream不会。这是在Visual Studio 2005中发生的,无论我使用的是默认语言环境还是“C”语言环境。
如果有人对此行为有解释(为什么它会神秘地改变 - 也许是VS2005的服务包?),并希望将便携式Unicode文件名的全面“最佳实践”放在一起C++代码。
也许你可以给的时间框架时发生这种情况。 Windows在过去几年中发生了很大变化。 – 2009-01-26 18:45:03
好点。这一变化发生在去年。 – Sol 2009-01-26 19:32:10