Delphi 7,TFileStream 无法打开带有特殊字符的文件

Joh*_*ith 0 delphi delphi-7

这一行:

TFileStream.Create(fileName, fmOpenRead or fmShareDenyNone);
Run Code Online (Sandbox Code Playgroud)

如果文件名包含类似ñ 的内容,则丢弃异常

Dav*_*nan 5

您最终调用的CreateFileA是 ANSI API,并且您使用的字符没有 ANSI 编码。解决这个问题的唯一方法是使用CreateFileWUnicode API打开文件。

您可能没有意识到您调用了CreateFileA,但这就是 Delphi 7 文件流的实现方式。

解决问题的一种简单方法是升级到最新的 Delphi,它对本机 Windows Unicode API 有很好的支持。

如果您坚持使用 ANSI Delphi,那么您仍然需要调用CreateFileW. 您可以这样做来创建文件句柄。您需要将 UTF-16 字符串传递给该 API。使用WideString存储它。您还需要以 UTF-16 格式从用户那里获取文件名。这意味着调用GetOpenFileNameWIFileDialog。通过将文件句柄传递给THandleStream.

为了使这一切成为可能,您将使用 TNT Unicode 库。它们运行良好,但会给您带来很大的负担。

坦率地说,正确的方法是使用支持 Unicode 的现代工具。

  • 使用基于 UTF-16 的 API 是最好的,是的。但是 `CreateFileA()` *CAN* 会打开一个包含 Unicode 字符的文件名,只要它们是在 Windows 的默认 ANSI 代码页中编码的。将 Unicode 字符放在 `WideString` 中并将其转换为 `AnsiString`(RTL 使用默认代码页进行转换)或使用 `GetOpenFileNameA()`,然后将生成的 ANSI 文件名传递给 `TFileStream` 或 `CreateFileA()` . 只要默认的 ANSI 代码页支持有问题的 Unicode 字符,它就可以正常工作。 (2认同)
  • @Remy 似乎有问题的代码页无法编码此字符。 (2认同)
  • @Deltics 大概如果可以对字符进行编码,那么文件将被打开。 (2认同)