C++ 如何获得C++;wfstream是否使用Unicode文件路径?

C++ 如何获得C++;wfstream是否使用Unicode文件路径?,c++,unicode,utf-8,filereader,wifstream,C++,Unicode,Utf 8,Filereader,Wifstream,我有一个应用程序正在使用utf-8编码的宽字符串处理文件I/O 工作代码: const wchar_t* wc = L"C:\Documents\TestPath\TestFile.txt"; std::wfstream wf(wc); wf.imbue(std::locale(wf.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>())); return wf.is_o

我有一个应用程序正在使用utf-8编码的宽字符串处理文件I/O

工作代码:

const wchar_t* wc = L"C:\Documents\TestPath\TestFile.txt";
std::wfstream wf(wc);
wf.imbue(std::locale(wf.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>()));
return wf.is_open();
...
wf << L"測試文件夾" << L"\n";
我做错了什么?似乎应该有一个简单的方法让wfstream使用unicode文件路径,但我在互联网上搜索了所有地方,却找不到


谢谢

您的字符串文本需要转义
\
字符,例如:

const wchar\u t*wc=L“C:\\Documents\\TestPath\\TestFile.txt”;
const wchar\u t*wc=L“C:\\Documents\\測試文件夾\\TestFile.txt”;
否则,请改用原始字符串文字:

const wchar\u t*wc=LR“(C:\Documents\TestPath\TestFile.txt)”;
const wchar\u t*wc=LR”(C:\Documents\測試文件夾\TestFile.txt)”;
也就是说,请仔细检查用于保存cpp文件的字符集是否与编译器用于解析文件的字符集匹配,否则请检查非ASCII字符,如
測試文件夾在字符串文本中无法正常工作

否则,请改用Unicode转义序列:

const wchar\u t*wc=L“C:\\Documents\\\u6e2c\u8a66\u6587\u4ef6\u593e\\TestFile.txt”;

谢谢大家的帮助

我发现了如何让代码与一个不同寻常的解决方案一起工作,这可能会帮助处于相同情况下的任何其他人:

  • 使用C-style wfopen创建文件
  • 使用::GetShortPathW函数获取新创建文件的UTF8路径的简短ASCII表示形式
  • 使用wfstream和imbue stream为UTF8 I/O打开文件
  • std::wfstream textFileStream;
    textFileStream.open(短路径,ios::in | ios::out);
    imbue(std::locale(textFileStream.getloc(),新std::codecvt_utf8());
    
    您没有收到来自编译器的任何警告吗?即使没有指定警告选项,MSVC也不会出现来自编译器的警告。当我跟随堆栈查看open失败的位置时,它似乎位于where
    中的第234行,如果(_Myfile!=0 | |(_File=_Fiopen(_Filename,_Mode,_Prot))==0)
    生成一个失败位。我认为代码没有任何问题,因为它可以很好地处理ASCII文件路径和unicode文件内容。
    L“…
    不是UTF-8编码的文本。您的源文件可能是UTF-8编码的。您是否使用
    /UTF-8
    编译器开关?
    const wchar_t* wc = L"C:\Documents\測試文件夾\TestFile.txt";
    std::wfstream wf(wc);
    return wf.is_open();
    
    FILE * fp = _wfopen(cpFullPath, L"w"); 
    fclose(fp); 
    
    wchar_t short_path[511] {} ;                                                
    ::GetShortPathNameW( cpFullPath, short_path, 511 ) ;
    // cpFullPath is L"C:\\Desktop\\測試文件夾\\те \x81това \x8f папка\\file.txt" 
    // short_path becomes L"C:\\Desktop\\12BE~3\\81C2~6\\file.txt"      
    
    std::wfstream textFileStream;
    textFileStream.open(short_path, ios::in | ios::out);
    textFileStream.imbue(std::locale(textFileStream.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>()));