我遇到了boost文件流的问题:我需要在windows下的用户目录中创建和修改文件。然而,用户名包含一个变音符号,它在MinGW下编译时会失败,因为标准缺少boost_使用的文件流的wide_char open()API。请参阅Read/Write file with unicode file name with plain C++/Boost,UTF-8-compliant IOstreams和https://svn.boost.org/trac10/ticket/9968在MinGW下使用boost :: filestream的UTF-8名称
但是我碰到了这个问题,这个问题主要发生在尝试使用系统代码页之外的字符时。在我的情况下,我只使用系统代码页中的字符,因为用户目录显然存在。这让我觉得,这应该工作,如果我能告诉的boost ::路径期望所有std::string
S作为beeing UTF8但在调用string()
成员函数(其中发生在boost::fstream::open
)
所以当把它们转换成系统编码基本上:有没有办法使用boost(和boost locale)自动地进行转换(UTF8->系统编码)?
是完整的,这里是我设置的区域代码:
#ifdef _WIN32
// On windows we want to enforce the encoding (mostly UTF8). Also using "" would use the default which uses "wrong" separators
std::locale::global(boost::locale::generator().generate("C"));
#else
// In linux/OSX this suffices
std::locale::global(std::locale::classic());
#endif // _WIN32
// Use also the encoding (mostly UTF8) for bfs paths
bfs::path::imbue(std::locale());
是的,我猜我需要这样下去。我甚至想创建一个新的iofstream类,就像boost类一样提供新的开放函数和ctors。你为什么要转换回UTF8? CP_ACP不会更好吗?为什么助推不会这样,因为这看起来很简单。像8.3这样的名称并不总是在ANSI或者ANSI之类的缺点? – Flamefire
发现退缩:这只适用于现有文件。所以需要确保文件确实存在,这可能会在尝试使用widechar实现创建并使用短路径方式打开时为竞争条件打开大门。 – Flamefire
因为它是跨平台的。所有现代* nixen将打开一个UTF-8文件名,并且不会破坏旧代码。同样,_all_ Windows文件名可以转换为OS可接受的8.3文件名“token”,这在技术上是UTF-8子集。 –