更改窄字符串编码或丢失 std::filesystem::path::imbue

Mik*_*ail 5 c++ utf-8 filepath boost-filesystem c++17

我在 Windows 上,并且正在std::filesystem::pathstd::string. 根据构造函数参考(强调我的):

如果源字符类型为char,则假定源的编码是本机窄编码(因此在 POSIX 系统上不会发生转换)

如果我理解正确的话,这意味着字符串内容将在 Windows 下被视为以 ANSI 编码。要将其视为以 UTF-8 编码,我需要使用std::filesystem::u8path()function. 请参阅演示:http://rextester.com/PXRH65151

我希望 的构造函数path将窄字符串的内容视为 UTF-8 编码。因为boost::filesystem::path我可以使用imbue()方法来做到这一点:

boost::filesystem::path::imbue(std::locale(std::locale(), new std::codecvt_utf8_utf16<wchar_t>()));
Run Code Online (Sandbox Code Playgroud)

但是,我在 中没有看到这样的方法std::filesystem::path。有没有办法实现这种行为std::filesystem::path?还是我需要u8path随地吐痰?

Nic*_*las 0

出于性能考虑,path没有全局方法来定义区域设置转换。由于 C++ pre-20 没有 UTF-8 字符串的特定类型,因此系统假定所有char字符串都是窄字符串。因此,如果您想使用 UTF-8 字符串,则必须通过向构造函数提供适当的转换区域设置或使用u8path.

C++20 给了我们char8_t,它总是被假定为 UTF-8。因此,如果您始终使用char8_t基于 - 的字符串(例如std::u8string),path则 的隐式转换将接受它并正常工作。

  • @Mikhail:不,这是一件好事。执行您所说的操作的唯一方法是假设 char 是 UTF-8 (这是一个错误的假设),或者通过使用一些全局区域设置内容使每个人的代码不必要地变慢。 (2认同)