c++ - 如何让 C++ wfstream 使用 Unicode 文件路径?
问题描述
我有一个使用 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";
但是,一旦在文件路径中引入了 unicode 字符,文件将不再正确打开。IE。以下代码不起作用并返回 false:
const wchar_t* wc = L"C:\Documents\測試文件夾\TestFile.txt";
std::wfstream wf(wc);
return wf.is_open();
我在这里做错了什么?似乎应该有一种简单的方法来让 wfstream 与 unicode 文件路径一起工作,但我已经在互联网上进行了搜索,但找不到。
谢谢
解决方案
感谢大家的帮助。
我发现了如何让代码与一个不寻常的解决方案一起工作,这可能会帮助其他处于相同情况的人:
- 使用 C 风格的 _wfopen 创建文件
FILE * fp = _wfopen(cpFullPath, L"w");
fclose(fp);
- 使用 ::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"
- 使用 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>()));
推荐阅读
- vba - 获取特定对象 vba 的库名称
- html - 使用 HTML、CSS 绘制三角形和形状
- c# - 如何使用 CRUD 功能创建连接到数据库的 Blazor WebAssembly 网站
- mysql - 扩展后连接到 apache 的问题,我在 Kubernetes 上的有状态数据库
- angular - 单击角度 12 中的每个 formArray 元素后,如何禁用 formArray 的特定单击事件?
- c++ - How unused default member initializer can change program behavior in C++?
- hibernate - 如何在休眠 4 中使用 Dto 而不是 Model 类
- extjs - 如何从来自 json 的商店上传动态数据
- r - 更改 ggplot-legend 中字形的颜色
- java - 如何直接从protobuf创建GRPC服务器而不将其编译成java代码