**标题: 你知道 C++ 中的三种字符串类型:std::string、std::wstring 和 std::u8string 吗?**

内容:

在 C++17 之前,标准库只提供了 std::string 用于存储字节字符串。然而随着多语言支持和 Unicode 的普及,C++ 标准库逐渐加入了几种不同编码的字符串类型:std::wstringstd::u16stringstd::u32stringstd::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::stringstd::u8string 简单、直接
需要与 Windows API 交互 std::wstring(L”…”) 与 Windows 兼容
跨平台宽字符 std::u16string / std::u32string 标准化、长度可预见
需要显式 UTF‑8 std::u8string C++20 后可使用,语义清晰

小结

C++ 的字符串类型已从最初的单字节 std::string 发展到多种宽字符与 UTF‑8 兼容的容器。正确选择取决于你的项目需求、目标平台以及对编码的依赖。掌握这些区别可以让你写出更安全、更可移植的代码。

发表评论