c++oding="utf-8" ?>
std::text 在 c++26 中尚未实现,当前编译器均不支持;正确做法是用 std::string_view 手动处理 utf-8 或依赖 icu/boost.text。

std::text 是 C++26 里还没落地的提案,现在用不了
目前所有主流编译器(GCC、Clang、MSVC)都未实现 std::text —— 它仍处于 ISO C++ 委员会的 TS(技术规范)草案阶段,连 C++23 都没纳入,C++26 也大概率不会完整上线。你搜到的文档多是提案草稿(如 P2467R0),不是可用 API。
常见错误现象:std::text::utf8_view 编译报错、namespace text has not been declared、头文件 <text></text> 找不到。
- 别在生产代码里写
#include <text></text>或调用std::text::decode,它不存在 - 当前唯一可移植的 Unicode 文本处理路径仍是
std::string_view+ 手动 UTF-8 边界检查,或依赖 ICU / Boost.Text - C++26 真正可能落地的是更底层的
std::unicode(P1949)子集,但仅限码点分类和简单规范化,不提供字符串视图
UTF-8 字符串长度 ≠ 字节数,std::string::size() 会骗人
std::string 对 UTF-8 完全无感,它只数字节。一个中文字符占 3 字节,"你好".size() 返回 6,但逻辑字符数是 2。直接用 size() 做截断、索引或对齐,必然出错。
使用场景:日志截断、终端宽度计算、CSV 字段对齐、JSON 序列化时的字符计数。
- 别用
s.substr(0, 10)截取“前 10 个字符”,可能切在 UTF-8 中间,产生无效序列 - 用
std::count_if(s.begin(), s.end(), [](unsigned char c) { return (c & 0xC0) != 0x80; })数 Unicode 字符数(统计 UTF-8 起始字节) - 需要随机访问第 n 个字符?老老实实从头遍历解码,或预构建索引表——没有 O(1) 解法
- 性能影响:每次计数/遍历都要解析 UTF-8,高频操作建议缓存字符偏移数组
std::codecvt 已被弃用,别再用它做 UTF-8 转换
std::codecvt_utf8 在 C++17 被标记为 deprecated,C++20 彻底移除。继续用它会导致 Clang/GCC 发出警告,MSVC 可能链接失败。
常见错误现象:error: 'codecvt_utf8' is deprecated,或运行时抛 std::runtime_error(某些 libstdc++ 实现)。
- 替代方案只有两个:手写轻量级 UTF-8 编解码(
char32_t↔std::string),或用成熟库(ICU 的u_strToUTF8、Boost.Text 的boost::text::to_utf8) - 手写示例(仅 decode):
std::vector<char32_t> utf8_to_utf32(std::string_view s) { std::vector<char32_t> out; for (size_t i = 0; i </char32_t></char32_t> - 注意:手动实现必须校验 UTF-8 格式(如避免超长编码、非法代理对),否则可能崩溃或安全漏洞
宽字符(wchar_t)不是 Unicode 安全解,Windows 和 Linux 表现完全不同
wchar_t 在 Windows 是 UTF-16(2 或 4 字节),Linux 多是 UTF-32(4 字节)。同一份代码,在两平台用 std::wstring 处理 emoji(如 ?)会得到不同行为:Windows 下可能拆成代理对,Linux 下当单个码点。
使用场景:跨平台 GUI 文本渲染、文件名处理、系统 API 交互(如 CreateFileW vs openat)。
- 别假设
sizeof(wchar_t) == 4,也别用std::wstring::length()当字符数——UTF-16 里代理对算两个wchar_t - 与系统 API 交互时,Windows 强制用 UTF-16,Linux 用 UTF-8;中间转换务必走明确编码(如用
iconv或 ICU) - 兼容性陷阱:
std::wcout在 Linux 终端常默认禁用宽字符输出,打印乱码不是你的错,是 locale 没设对(setlocale(LC_ALL, "en_US.UTF-8"))
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











