0

我正在使用以下界面设置硬盘驱动器上文件的路径:

void setPath(const char* path);

此路径将用于基本文件 I/O。

例如,如果我提供一个包含中文字符的路径(例如通过 QString::toUtf8()),这对于 Unix 来说很好,但对于 Windows 来说当然不行,因为内部使用了 wchar/wstring API。

我现在正在寻找一种优雅的方法来使这个接口 UTF-8 在基于 Windows 和 Unix 的系统上兼容。有没有办法避免在基于 Windows 的系统上使用广泛的 API 并继续使用 std::string 和 std::ofstream() ?

在查看 boost::locale 之后,这在我看来是一种处理 UTF-8 编码的可能性。这会是一种方法吗(例如,用 boost::ofstream() 对应物替换 std::ofstream ?)

const std::locale loc = generator.generate(std::locale(), "zh_CN.UTF-8");
std::locale::global(loc);
std::cout.imbue(std::locale());
boost::filesystem::path::imbue(std::locale())

感谢所有帮助。

4

1 回答 1

1

有没有办法避免在基于 Windows 的系统上使用广泛的 API

Windows API 不支持 UTF-8,除了少数选择的 API。很大程度上它只支持依赖于语言环境的 ANSI 和 UTF-16。要在不丢失数据的情况下支持 Unicode,您必须使用基于 UTF-16 的 API。

将 UTF-8 字符串传递给 Windows API 函数时,您的接口需要在内部将其转换为 UTF-16,并在从 API 接收数据时将其从 UTF-16 转换为 UTF-8。没有其他办法。这属于您的底层平台特定逻辑,而不是更高层的公共接口。

并继续使用 std::string 和 std::ofstream() ?

您可以使用std::stringUTF-8,并且有很多方法可以在std::stringUTF-8 和std::wstringUTF-16 之间进行转换(甚至 C++11 中的类可以处理这种情况)。

Microsoft 对 Visual Studio 有非标准扩展,std::ifstreamstd::ofstream在其中接受 UTF-16 文件名。其他供应商可能会或可能不会提供类似的功能。

于 2015-05-27T00:56:02.723 回答