Namespaces
Variants

Null-terminated multibyte strings

From cppreference.net

以空字符结尾的多字节字符串(NTMBS),或称“多字节字符串”,是由非零字节序列后接一个值为零的字节(终止空字符)组成的字符串。

字符串中存储的每个字符可能占用超过一个字节。用于表示多字节字符串中字符的编码是与区域设置相关的:可能是UTF-8、GB18030、EUC-JP、Shift-JIS等。例如,字符数组 { ' \xe4 ' , ' \xbd ' , ' \xa0 ' , ' \xe5 ' , ' \xa5 ' , ' \xbd ' , ' \0 ' } 是一个NTMBS,其中包含UTF-8多字节编码的字符串 "你好" :前三个字节编码字符“你”,后三个字节编码字符“好”。同一字符串在GB18030编码下是字符数组 { ' \xc4 ' , ' \xe3 ' , ' \xba ' , ' \xc3 ' , ' \0 ' } ,其中每个字符被编码为双字节序列。

在某些多字节编码中,任何给定的多字节字符序列可能根据先前的字节序列表示不同的字符,这被称为"移位序列"。这类编码被称为状态依赖型:解释每个字符时需要了解当前移位状态。一个NTMBS仅当它以初始移位状态开始和结束时才有效:如果使用了移位序列,则必须在终止空字符前出现相应的非移位序列。这类编码的示例包括BOCU-1和 SCSU

多字节字符串在布局上与 空终止字节字符串 (NTBS)兼容,即可以使用相同的设施进行存储、复制和检查,但字符数量计算除外。若正确的区域设置生效,I/O函数同样能处理多字节字符串。通过以下区域设置相关的转换函数,可实现多字节字符串与宽字符串的相互转换:

目录

函数

多字节/宽字符转换
定义于头文件 <stdlib.h>
返回下一个多字节字符的字节数
(函数)
将下一个多字节字符转换为宽字符
(函数)
将宽字符转换为其多字节表示形式
(函数)
将窄多字节字符串转换为宽字符串
(函数)
将宽字符串转换为窄多字节字符串
(函数)
定义于头文件 <wchar.h>
(C95)
检查 mbstate_t 对象是否表示初始移位状态
(函数)
(C95)
若可能,将单字节窄字符扩展为宽字符
(函数)
(C95)
若可能,将宽字符窄化为单字节窄字符
(函数)
(C95)
给定状态,返回下一个多字节字符的字节数
(函数)
(C95)
给定状态,将下一个多字节字符转换为宽字符
(函数)
给定状态,将宽字符转换为其多字节表示形式
(函数)
给定状态,将窄多字节字符串转换为宽字符串
(函数)
给定状态,将宽字符串转换为窄多字节字符串
(函数)
定义于头文件 <uchar.h>
(C23)
将窄多字节字符转换为 UTF-8 编码
(函数)
(C23)
将 UTF-8 字符串转换为窄多字节编码
(函数)
将窄多字节字符转换为 UTF-16 编码
(函数)
将 UTF-16 字符转换为窄多字节编码
(函数)

类型

定义于头文件 <uchar.h>
定义于头文件 <wchar.h>
迭代多字节字符串所需的转换状态信息
(类)
定义于头文件 <uchar.h>
(C23)
8位字符类型
(typedef)
16位字符类型
(typedef)
32位字符类型
(typedef)

定义于头文件 <limits.h>
MB_LEN_MAX
多字节字符的最大字节数,适用于任何受支持的区域设置
(宏常量)
定义于头文件 <stdlib.h>
MB_CUR_MAX
当前区域设置中多字节字符的最大字节数
(宏变量)

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.10 整数类型的大小 <limits.h> (页: TBD)
  • 7.22 通用工具 <stdlib.h> (页: TBD)
  • 7.28 Unicode 工具 <uchar.h> (页: TBD)
  • 7.29 扩展多字节和宽字符工具 <wchar.h> (页: TBD)
  • 7.31.12 通用工具 <stdlib.h> (页: TBD)
  • 7.31.16 扩展多字节和宽字符工具 <wchar.h> (页: TBD)
  • K.3.6 通用工具 <stdlib.h> (页: TBD)
  • K.3.9 扩展多字节和宽字符工具 <wchar.h> (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.10 整数类型的大小 <limits.h> (页码: 待定)
  • 7.22 通用工具 <stdlib.h> (页码: 待定)
  • 7.28 Unicode 工具 <uchar.h> (页码: 待定)
  • 7.29 扩展多字节和宽字符工具 <wchar.h> (页码: 待定)
  • 7.31.12 通用工具 <stdlib.h> (页码: 待定)
  • 7.31.16 扩展多字节和宽字符工具 <wchar.h> (页码: 待定)
  • K.3.6 通用工具 <stdlib.h> (页码: 待定)
  • K.3.9 扩展多字节和宽字符工具 <wchar.h> (页码: 待定)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.10 整数类型的大小 <limits.h> (页码: 222)
  • 7.22 通用工具 <stdlib.h> (页码: 340-360)
  • 7.28 Unicode 工具 <uchar.h> (页码: 398-401)
  • 7.29 扩展多字节和宽字符工具 <wchar.h> (页码: 402-446)
  • 7.31.12 通用工具 <stdlib.h> (页码: 456)
  • 7.31.16 扩展多字节和宽字符工具 <wchar.h> (页码: 456)
  • K.3.6 通用工具 <stdlib.h> (页码: 604-614)
  • K.3.9 扩展多字节和宽字符工具 <wchar.h> (页码: 627-651)
  • C99标准(ISO/IEC 9899:1999):
  • 7.10 整数类型的大小 <limits.h> (页: 203)
  • 7.20 通用工具 <stdlib.h> (页: 306-324)
  • 7.24 扩展多字节和宽字符工具 <wchar.h> (页: 348-392)
  • 7.26.10 通用工具 <stdlib.h> (页: 402)
  • 7.26.12 扩展多字节和宽字符工具 <wchar.h> (页: 402)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.1.4 限制 <float.h> 与 <limits.h>
  • 4.10 通用工具 <stdlib.h>
  • 4.13.7 通用工具 <stdlib.h>

参见

C++ 文档 关于 Null-terminated multibyte strings