空终止多字节字符串
空终止多字节字符串( NTMBS ),或称“多字节字符串”,是后面跟随一个零值字节(空终止字符'\0')的一串非零字节。
每个存储于字符串中的字符可能占用多于一个字节。在多字节字符串中,用于表示字符的编码是本地环境限定的:它可以是 UTF-8 、 GB18030 、 EUC-JP 、 Shift-JIS 等等。例如,字符数组 {'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0'} 是一个以 UTF-8 多字节编码表示字符串 "你好" 的 NTMBS :前三字节编码字符 "你" ,后三字节编码字符 "好" 。用 GB18030 编码的相同字符串是字符数组 {'\xc4', '\xe3', '\xba', '\xc3', '\0'} ,其中两个字符都编码成双字符序列。
一些多字节字符串中,任何给定的多字节字符序列可能会根据前置的字节序列表示不同的字符,这个前置序列称为“迁移序列”。此类编码是依赖状态的:需要当前迁移状态来转译每一个字符。若起始和终止为初始迁移状态, NTMBS 才是合法的:即若多字节编码使用迁移序列,则字符串结束前的整个序列必须为未迁移序列。这类编码的例子是 BOCU-1 和 SCSU 。
多字节字符串与空终止字节字符串( NTBS )布局兼容,即是说,可以使用同样的工具存储、复制和检验,除了计算字符数的情况。若正确的本地环境正在发挥作用,则输入/输出函数亦可控制多字节字符串。运用下列依赖本地环境的函数,多字节字符串可以与宽字符串相互转换:
多字节/宽字符转换
定义于头文件
<stdlib.h> | |
返回下一个多字节字符的字节数 (函数) | |
将下一个多字节字符转换成宽字符 (函数) | |
(C11) |
将宽字符转换成其多字节表示 (函数) |
(C11) |
将窄多字节字符串转换成宽字符串 (函数) |
(C11) |
将宽字符串转换成窄多字节字符串 (函数) |
定义于头文件
<wchar.h> | |
(C95) |
检查 mbstate_t 对象是否表示初始迁移状态 (函数) |
(C95) |
将单字节窄字符加宽成宽字符,倘若可能 (函数) |
(C95) |
将宽字符收窄成单字节窄字符,倘若可能 (函数) |
(C95) |
给定状态,返回下一个多字节字符的字节数 (函数) |
(C95) |
给定状态,将下一个多字节字符转换成宽字符 (函数) |
(C95)(C11) |
给定状态,将宽字符转换成其多字节表示 (函数) |
(C95)(C11) |
给定状态,将窄多字节字符串转换成宽字符串 (函数) |
(C95)(C11) |
给定状态,将宽字符串转换成窄多字节字符串 (函数) |
定义于头文件
<uchar.h> | |
(C11) |
从窄多字节字符串生成下一个16位宽字符 (函数) |
(C11) |
将16位宽字符转换成窄多字节字符串 (函数) |
(C11) |
从窄多字节字符串生成下一个32位宽字符 (函数) |
(C11) |
将32位宽字符转换成窄多字节字符串 (函数) |
类型
定义于头文件
<wchar.h> | |
(C95) |
迭代多字节字符串所需的转换信息 (结构体) |
定义于头文件
<uchar.h> | |
(C11) |
16 位宽字符类型 (typedef) |
(C11) |
32 位宽字符类型 (typedef) |
宏
定义于头文件
<limits.h> | |
MB_LEN_MAX |
多字节字符的最大字节数 (宏常量) |
定义于头文件
<stdlib.h> | |
MB_CUR_MAX |
当前C本地环境中的多字节字符最大字节数 (宏变量) |
定义于头文件
<uchar.h> | |
__STDC_UTF_16__ (C11) |
指示 mbrtoc16 及 c16rtomb 使用 UTF-16 编码 (宏常量) |
__STDC_UTF_32__ (C11) |
指示 mbrtoc32 及 c32rtomb 使用 UTF-32 编码 (宏常量) |
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.10 Sizes of integer types <limits.h> (p: 222)
- 7.22 General utilities <stdlib.h> (p: 340-360)
- 7.28 Unicode utilities <uchar.h> (p: 398-401)
- 7.29 Extended multibyte and wide character utilities <wchar.h> (p: 402-446)
- 7.31.12 General utilities <stdlib.h> (p: 456)
- 7.31.16 Extended multibyte and wide character utilities <wchar.h> (p: 456)
- K.3.6 General utilities <stdlib.h> (p: 604-614)
- K.3.9 Extended multibyte and wide character utilities <wchar.h> (p: 627-651)
- C99 standard (ISO/IEC 9899:1999):
- 7.10 Sizes of integer types <limits.h> (p: 203)
- 7.20 General utilities <stdlib.h> (p: 306-324)
- 7.24 Extended multibyte and wide character utilities <wchar.h> (p: 348-392)
- 7.26.10 General utilities <stdlib.h> (p: 402)
- 7.26.12 Extended multibyte and wide character utilities <wchar.h> (p: 402)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.1.4 Limits <float.h> and <limits.h>
- 4.10 GENERAL UTILITIES <stdlib.h>
- 4.13.7 General utilities <stdlib.h>