Boost.Locale
Microsoft Windows 下的默认编码

所有现代操作系统都使用 Unicode。

  • Unix 操作系统家族默认使用 UTF-8 编码。
  • Microsoft Windows 已经迁移到 Wide/UTF-16 API。窄编码已被弃用,并且原生 OS API 变成了所谓的“Wide API”。

由于方法截然不同,因此编写可移植的 Unicode 应用非常困难。

Boost.Locale 完全支持窄 API 和宽 API。在 Windows 上,默认字符编码假定为 UTF-8。

因此,如果默认操作系统 Locale 是“English_USA.1252”,则 Windows 上 Boost.Locale 的默认 locale 将为“en_US.UTF-8”。

当创建的 locale 对象全局安装后,任何使用 std::codecvt 在窄 API 和原生宽 API 之间进行转换的库都将正确处理 UTF-8。

Boost.Filesystem v3 就是这样一个库的很好的例子。

例如

#include <boost/locale.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
int main()
{
// 创建并安装全局 locale
std::locale::global(boost::locale::generator().generate(""));
// 使 boost.filesystem 使用它
boost::filesystem::path::imbue(std::locale());
// 现在可以完美地使用 UTF-8 了!
boost::filesystem::ofstream hello("שלום.txt");
}
用于 locale 生成的主要类
定义 generator.hpp:101

然而,这种行为可能会破坏假设当前编码是单字节编码(如代码页 1252)的现有软件。

boost::locale::generator 类具有属性 use_ansi_encoding(),该属性允许将行为更改为旧版行为,并选择 ANSI 代码页作为默认系统编码。

因此,当当前 locale 为“English_USA.1252”并且 use_ansi_encoding 开启时,默认 locale 将为“en_US.windows-1252”。

注意
winapi 后端不支持 ANSI 编码;因此 UTF-8 编码始终用于窄字符。