C++ 从DOS 8.3文件名在windows中打开Unicode文件名

C++ 从DOS 8.3文件名在windows中打开Unicode文件名,c++,windows,unicode,fstream,C++,Windows,Unicode,Fstream,我是否可以为unicode文件名生成一个8.3文件名,并使用该ASCII字符字符串在Windows中打开fstream 我知道MSVC++为fstream提供了一个wchar\u t*重载,但是GCC的libstdc++没有提供这个:(,所以我需要一个替代方法。我不想仅仅为此创建我自己的streambuf类,因为这似乎有些过分。你可能可以利用Windows API函数来给你一个简短的名字。你不能“计算”名称的算法,因为在任意长名称和短名称之间没有一对一的对应关系,而且我认为您不能避免使用Wind

我是否可以为unicode文件名生成一个8.3文件名,并使用该ASCII字符字符串在Windows中打开
fstream


我知道MSVC++为
fstream
提供了一个
wchar\u t*
重载,但是GCC的libstdc++没有提供这个:(,所以我需要一个替代方法。我不想仅仅为此创建我自己的streambuf类,因为这似乎有些过分。

你可能可以利用Windows API函数来给你一个简短的名字。你不能“计算”名称的算法,因为在任意长名称和短名称之间没有一对一的对应关系,而且我认为您不能避免使用Windows API进行翻译。

是的,当然,但这对打开unicode文件名的
fstream
s有用吗?没有“unicode文件名”(例如)。但是您只能将
char*
传递给
fstream
,因此在Windows上,您最好使用短文件名,该文件名是从“unicode名称”获取的"by said API function.GetShortPathName是为向后兼容较旧的文件系统而设计的,所以它应该可以。是的,好的,这正是计划。我知道我的措辞不准确,但在Windows上,它足够准确,可以让我的问题得到解答。谢谢!您的链接举例说明了我的问题。@Rubenvb:您可以安全地转换W-ve的结果REST到一个chstring字符串,使用 WCSTOBS,只保证短路径名为ASCII,因此您甚至不必为该区域而烦恼。它不过载,它有STD::WFString类。它是标准C++库的一部分。当然可以找到一个实现它的CRT。@:WFSUSTER是一个数据流,它的数据来自UNN。它属于
wchar\u t
,但是你确定它能够通过
wchar\u t*
打开文件吗?@Hans:我想要一个
fstream
,因为文件是UTF-8,我不想从中提取
wchar\u t
。但是文件名当然可以包含非ASCII字符。@Hans:
std::wfstream
打开一个
char*
filename,而不是
wchar\u t*
…8.3文件名仅用于旧版应用程序,可以禁用。永远不要使用它们。如果必须使用GCC,您可能别无选择,只能跳过整个标准库并直接使用Windows API(
CreateFileW
等)。