内容:
在 C++17 之前,标准库只提供了 std::string 用于存储字节字符串。然而随着多语言支持和 Unicode 的普及,C++ 标准库逐渐加入了几种不同编码的字符串类型:std::wstring、std::u16string、std::u32string 和 std::u8string。下面逐个拆解它们的区别与使用场景。
1. std::string
- 底层类型:
char(8 位) - 编码:通常是单字节编码(如 ASCII、ISO‑8859‑1)或多字节编码(如 UTF‑8,取决于环境)
- 用途:最常用的字符串类型,适用于大多数日常文本处理
- 注意:如果你在
std::string中存储 UTF‑8,需要注意字符边界和字节计数与字符计数不一致。
std::string ascii = "Hello, World!";
std::string utf8 = u8"你好,世界!";
2. std::wstring
- 底层类型:
wchar_t(宽字符) - 大小:Windows 上为 2 字节(UTF‑16),Linux/macOS 上为 4 字节(UTF‑32)
- 编码:与平台相关;在 Windows 为 UTF‑16,Unix 为 UTF‑32
- 用途:适用于需要宽字符支持的平台;例如 Windows API 的
L"..."字面量 - 缺点:跨平台时大小不一致,导致可移植性问题。
std::wstring w = L"こんにちは";
3. std::u16string / std::u32string
- 底层类型:
char16_t/char32_t - 编码:分别对应 UTF‑16 / UTF‑32
- 用途:标准化的宽字符容器,跨平台统一长度
- 使用:在现代 C++ 中推荐使用
char16_t/char32_t与对应字符串类型,以避免wchar_t的平台差异。
std::u16string u16 = u"👍";
std::u32string u32 = U"𐍈";
4. std::u8string(C++20 引入)
- 底层类型:
char8_t - 编码:UTF‑8
- 用途:与
std::string类似,但语义更清晰,强调使用 UTF‑8 - 注意:
char8_t不是char,与 C 语言字符串互操作需要显式转换。
std::u8string u8 = u8"Hello, 世界";
选择哪一种?
| 场景 | 推荐类型 | 说明 |
|---|---|---|
| 纯文本、ASCII 或 UTF‑8 | std::string 或 std::u8string |
简单、直接 |
| 需要与 Windows API 交互 | std::wstring(L”…”) |
与 Windows 兼容 |
| 跨平台宽字符 | std::u16string / std::u32string |
标准化、长度可预见 |
| 需要显式 UTF‑8 | std::u8string |
C++20 后可使用,语义清晰 |
小结
C++ 的字符串类型已从最初的单字节 std::string 发展到多种宽字符与 UTF‑8 兼容的容器。正确选择取决于你的项目需求、目标平台以及对编码的依赖。掌握这些区别可以让你写出更安全、更可移植的代码。