Skip to content

C++ 流与本地化

C++ locale 由多个 facet 组成,负责字符分类、数字格式、货币格式、时间格式和字符转换。流对象各自保存一个 locale。

设置 locale

cpp
#include <iostream>
#include <locale>

try {
    std::locale environment("");
    std::cout.imbue(environment);
} catch (const std::runtime_error&) {
    // 系统没有对应 locale 时回退
}

空字符串请求使用当前环境配置。可用 locale 名称取决于操作系统,不能假设同一个名字在所有机器上存在。

数字格式

cpp
class grouped : public std::numpunct<char> {
protected:
    char do_thousands_sep() const override { return ','; }
    std::string do_grouping() const override { return "\3"; }
};

std::locale custom(std::locale::classic(), new grouped);
std::cout.imbue(custom);
std::cout << 1234567; // 1,234,567

locale 会接管 facet 的所有权,不应手动释放传入的动态对象。

Unicode 边界

locale 不是完整的 Unicode 文本处理方案。UTF-8 中一个用户可见字符可能包含多个代码单元,大小写转换、规范化和字素切分通常需要 ICU 等专用库。

工程中应明确三件事:源文件编码、程序内部编码、外部协议编码。对文件与网络协议通常优先选择 UTF-8,并在系统 API 边界进行显式转换。

SIGNAL MAINTAINED · BUILT FROM MARKDOWN