【问题标题】:Opening Unicode filenames in windows from DOS 8.3 filenames从 DOS 8.3 文件名在 Windows 中打开 Unicode 文件名
【发布时间】:2011-06-23 12:37:37
【问题描述】:

我可以为 unicode 文件名生成 8.3 文件名并使用 char 的 ASCII 字符串在 Windows 中打开 fstream 吗?

我知道 MSVC++ 为 fstream 提供了一个 wchar_t* 重载,但 GCC 的 libstdc++ 没有提供这个 :(,所以我需要一个替代方案。我不想为此创建自己的 streambuf 类,因为好像有点矫枉过正。

【问题讨论】:

  • 它不会重载,它有 std::wfstream 类。这是标准 C++ 库的一部分。当然你可以找到一个实现它的crt。
  • @Hans:wfstream是一个data以wchar_t为单位的流,但是你确定它可以通过wchar_t*打开文件吗?
  • @Hans:我想要一个fstream,因为文件是UTF-8,我不想从中提取wchar_ts。但是文件名当然可以包含非 ASCII 字符。
  • @Hans: 和std::wfstream 打开char* 文件名,而不是wchar_t*...
  • 8.3 文件名仅适用于旧版应用程序,可以禁用。永远不要使用它们。如果您必须使用 GCC,您可能别无选择,只能跳过整个标准库并直接使用 Windows API(CreateFileW 等)。

标签: c++ windows unicode fstream


【解决方案1】:

您可能可以利用 Windows API 函数 GetShortPathName 为您提供简称。您无法通过算法“计算”名称,因为任意长名称和短名称之间没有一对一的对应关系,而且我认为您无法避免使用 Windows API 进行翻译。

【讨论】:

  • 是的,当然,但这对于为 unicode 文件名打开 fstreams 是否有效?
  • 没有“unicode 文件名”之类的东西(例如see here)。但是您只能将char* 传递给fstream,因此在Windows 上您最好使用短文件名,您可以通过所述API 函数从您的“unicode name”中获得。
  • GetShortPathName 旨在向后兼容旧文件系统,所以应该没问题。
  • 是的,好的,这正是计划。我知道我的措辞不准确,但在 Windows 上,它足够准确,足以让我的问题得到解决。谢谢!您的链接说明了我的问题。
  • @Rubenvb:你可以用wcstombs安全地将W版本的结果转换为字符字符串,短路径名保证只有ASCII,所以你甚至不需要打扰语言环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多