1

我有一个使用 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"測試文件夾&quot; << L"\n";

但是,一旦在文件路径中引入了 unicode 字符,文件将不再正确打开。IE。以下代码不起作用并返回 false:

const wchar_t* wc = L"C:\Documents\測試文件夾\TestFile.txt";
std::wfstream wf(wc);
return wf.is_open();

我在这里做错了什么?似乎应该有一种简单的方法来让 wfstream 与 unicode 文件路径一起工作,但我已经在互联网上进行了搜索,但找不到。

谢谢

4

2 回答 2

1

感谢大家的帮助。

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

  1. 使用 C 风格的 _wfopen 创建文件
FILE * fp = _wfopen(cpFullPath, L"w"); 
fclose(fp); 
  1. 使用 ::GetShortPathW 函数获取新创建文件的 UTF8 路径的短 ASCII 表示
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"      
  1. 使用 wfstream 和 imbue 流打开文件以进行 UTF8 I/O
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>())); 
于 2020-12-18T21:22:11.637 回答
0
于 2020-12-18T20:48:07.560 回答