C++ 如何获得C++;wfstream是否使用Unicode文件路径?
我有一个应用程序正在使用utf-8编码的宽字符串处理文件I/O 工作代码: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
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>()));