【发布时间】:2014-06-17 02:45:45
【问题描述】:
我想使用 boost 文件系统读取/写入具有 unicode 文件名的文件,在 Windows (mingw) 上提升语言环境(最后应该与平台无关)。
这是我的代码:
#include <boost/locale.hpp>
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
namespace fs = boost::filesystem;
#include <string>
#include <iostream>
int main() {
std::locale::global(boost::locale::generator().generate(""));
fs::path::imbue(std::locale());
fs::path file("äöü.txt");
if (!fs::exists(file)) {
std::cout << "File does not exist" << std::endl;
}
fs::ofstream(file, std::ios_base::app) << "Test" << std::endl;
}
fs::exists 真正检查名称为 äöü.txt 的文件。
但是写入的文件名为äöü.txt。
阅读也有同样的问题。使用fs::wofstream 也无济于事,因为它只是处理宽输入。
如何使用 C++11 和 boost 解决这个问题?
编辑:错误报告发布:https://svn.boost.org/trac/boost/ticket/9968
澄清赏金:使用 Qt 非常简单,但我想要一个仅使用 C++11 和 Boost、没有 Qt 和没有 ICU 的跨平台解决方案。
【问题讨论】:
-
实际上,给定
äöü.txt,它看起来像文字已经 UTF8,除了boost::fs::path将其视为CodePage 1252。或者更有可能,@ 987654329@ 完全忽略编码,只是传递给操作系统,操作系统假设它的代码页为 1252。 -
重读问题,
fs::exists工作正常,这意味着错误必须在boost::fs::ofstream中。我猜它检测到您正在使用 GCC 进行编译,因此错误地决定向操作系统传递 UTF8 编码的文件名。那将是一个提升错误。 (答案已被删除,但 OP 澄清的问题对于宽字符串文字是相同的) -
可能
äöü不在源字符集中;尝试用等效的十六进制文字替换它们(我假设您的意思是可以存储在 8 位字符中的这些字符的版本)。 -
但是,为什么
fs::exists有效?这似乎确实是文件系统流中的一个问题,所以我正在寻找没有它们的解决方案,或者为它们提供修复。 -
源文件的编码可能是一切,但最有可能是UTF8。但我不明白为什么内容对文件名很重要。系统编码是用户使用的任何东西,因为我需要它独立于平台。目前我正在 Windows 上进行测试,所以 cp 1252。
标签: c++ boost unicode boost-filesystem boost-locale