char32_t
和 char16_t
背景
在 C++11 之前,C++ 的字符类型主要有以下几种:
char
:表示单字节字符,通常用于 ASCII 或基于系统编码的字符串。wchar_t
:表示宽字符,通常用于支持多字节字符(如 UTF-16 或 UTF-32)。
虽然 wchar_t
被设计用来处理多字节字符,但它存在以下问题:
-
跨平台行为不一致:
- 在 Windows 平台上,
wchar_t
通常是 16 位宽,用于存储 UTF-16 编码的字符。 - 在大多数 Unix 和 Linux 系统上,
wchar_t
通常是 32 位宽,用于存储 UTF-32 编码的字符。 - 这种差异导致了代码的跨平台兼容性问题。
- 在 Windows 平台上,
-
类型混淆:
- 没有明确区分字符编码(UTF-8、UTF-16 或 UTF-32)。
- 程序员需要自己确保字符数组的编码一致,容易引入错误。
-
缺乏 Unicode 支持的明确标准:
- 在处理 Unicode 字符串时,开发者需要依赖第三方库,如 ICU(International Components for Unicode),而标准库并没有提供明确的支持。
为了解决这些问题,C++11 引入了两个新的字符类型:char16_t
和 char32_t
。
char16_t
和 char32_t
简介
C++11 新增了 char16_t
和 char32_t
类型,用于明确表示 Unicode 编码中的 UTF-16 和 UTF-32 字符。
-
char16_t
:- 用于表示一个 16 位的 UTF-16 编码单元。
- 大多数字符可以用一个
char16_t
表示,但对于某些扩展字符(补充平面字符),需要使用两个char16_t
(代理对)。
-
char32_t