【问题标题】:MFC program crashes opening files with Japanese characters in their namesMFC 程序在打开名称中包含日文字符的文件时崩溃
【发布时间】:2012-04-27 23:14:45
【问题描述】:

我在一家位于英国的软件公司工作。我们有一个最近移植到 64 位 Windows 的程序。在构建 64 位版本的同时,我们也从 Visual Studio 2003 切换到 2010,继续使用 MFC 的代码页版本(mfc100.dll)。

在我们完全发布程序后不久,我们收到了来自使用 64 位 Windows 7 的日本用户的错误报告。如果文件名中包含日文字符(甚至文件夹名称中包含日文字符)是以交互方式打开,程序失败并显示以下消息: “遇到了不恰当的论点”

尝试用新名称保存文件是类似的。该程序的 Visual Studio 2003 版本按预期工作。

程序使用 MFC 类 CFileDialog 来提示用户,并使用 Windows CopyFile() 函数将文件复制到/从用户指定的位置。

有什么线索可以解决这个问题吗?

【问题讨论】:

  • 您使用的是 Unicode 版本吗?
  • 没有。从长远来看,我们打算对其进行转换,但该程序可以追溯到 Windows 95 时代并且相当大。
  • 安德鲁,你有没有解决这个问题?我在仍然使用 MBCS 的旧应用程序上看到了同样的情况

标签: windows unicode mfc internationalization


【解决方案1】:

如果您使用 MBCS 而不是 Unicode,只有当您的系统区域设置为日语时,才会正确处理日语路径/文件名。

如果您的系统区域设置未设置为日语,则路径/文件名将被转换为您的代码页并包含垃圾(通常以????? 的形式)。

将您的语言环境设置为日语并测试您的程序。 如果它按预期工作,那么您就解决了问题。

然后可能的解决方案是仅为 CFileDialog 切换到 Unicode。调用底层 Win32 API 的 Unicode 版本而不是 CFileDialog 类方法。将所有路径/文件名获取为 unicode (wchar_t*),然后使用 WideCharToMultibyte 函数将它们转换为 MBCS。

【讨论】:

  • 日本用户的系统区域设置为日语,而我尝试在我的英语计算机上读取和写入带有日语名称的文件时收到的错误消息完全不同。
  • 当区域设置为日语时,您是否会在 您的 comp 上收到这些消息?
  • 程序使用 MFC OnOpenDocument() 方法读取文件。大概我们需要绕过它来获取 Unicode 路径。
  • 我尝试将我的计算机设置为日语并运行调试器。当我尝试打开文件时,CRecentFileList::Add() 通过调用 A2W() 将字符串转换为 UTF-16,它调用 MultiByteToWideChar() 并将代码页参数设置为 CP_THREAD_ACP。对 MultiByteToWideChar() 的调用将文件名(在日语代码页中返回)解释为代码页 1252,以下将文件名保存在注册表中的调用失败并报告异常。
  • 您使用什么 API 将其保存在注册表中?
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多