Null-terminated multibyte strings
以空字符结尾的多字节字符串(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仅当起始和结束于初始移位状态时才有效:若使用了移位序列,则必须在终止空字符前出现对应的非移位序列。这类编码的示例包括7位JIS、BOCU-1和 SCSU 。
多字节字符串与以空字符结尾的字节字符串(NTBS)在布局上是兼容的,也就是说,除了计算字符数量外,可以使用相同的设施进行存储、复制和检查。如果正确的区域设置生效,I/O函数也能处理多字节字符串。多字节字符串可以通过 std::codecvt 成员函数、 std::wstring_convert 或以下依赖于区域设置的转换函数与宽字符串相互转换:
| 目录 | 
函数
| 多字节/宽字符转换 | |
| 
          定义于头文件
           
           
            <cstdlib>
           
           | |
| 返回下一个多字节字符的字节数 (函数) | |
| 将下一个多字节字符转换成宽字符 (函数) | |
| 将宽字符转换成其多字节表示 (函数) | |
| 将窄多字节字符串转换成宽字符串 (函数) | |
| 将宽字符串转换成窄多字节字符串 (函数) | |
| 
          定义于头文件
           
           
            <cwchar>
           
           | |
| 给定状态,返回下一个多字节字符的字节数 (函数) | |
| 检查
         
          
           std::mbstate_t
          
         
         对象是否表示初始移位状态 (函数) | |
| 若可能,则扩展单字节窄字符为宽字符 (函数) | |
| 若可能,则收缩宽字符为单字节窄字符 (函数) | |
| 给定状态,将下一个多字节字符转换成宽字符 (函数) | |
| 给定状态,将宽字符转换成其多字节表示 (函数) | |
| 给定状态,将窄多字节字符串转换成宽字符串 (函数) | |
| 给定状态,将宽字符串转换成窄多字节字符串 (函数) | |
| 
          定义于头文件
           
           
            <cuchar>
           
           | |
| 
           
            
             
              (C++20)
             
            
           
           | 将窄多字节字符转换成 UTF-8 编码 (函数) | 
| 
           
            
             
              (C++20)
             
            
           
           | 将 UTF-8 字符串转换成窄多字节编码 (函数) | 
| 
           
            
             
              (C++11)
             
            
           
           | 将窄多字节字符转换成 UTF-16 编码 (函数) | 
| 
           
            
             
              (C++11)
             
            
           
           | 将 UTF-16 字符转换成窄多字节编码 (函数) | 
| 
           
            
             
              (C++11)
             
            
           
           | 将窄多字节字符转换成 UTF-32 编码 (函数) | 
| 
           
            
             
              (C++11)
             
            
           
           | 将 UTF-32 字符转换成窄多字节编码 (函数) | 
类型
| 
          定义于头文件
           
           
            <cwchar>
           
           | |
| 迭代多字节字符串所需的转换状态信息 (类) | |
宏
| 
          定义于头文件
           
           
            <climits>
           
           | |
| 
           
            
             MB_LEN_MAX
            
           
           | 多字节字符的最大字节数 (宏常量) | 
| 
          定义于头文件
           
           
            <cstdlib>
           
           | |
| 
           
            
             MB_CUR_MAX
            
           
           | 当前 C 本地环境中多字节字符的最大字节数 (宏变量) | 
| 
          定义于头文件
           
           
            <cuchar>
           
           | |
| 
           
            
             __STDC_UTF_16__
            
           
           
           
            
             
              (C++11)
             
            
           
           | 指示 mbrtoc16 和 c16rtomb 使用 UTF-16 编码 (宏常量) | 
| 
           
            
             __STDC_UTF_32__
            
           
           
           
            
             
              (C++11)
             
            
           
           | 指示 mbrtoc32 和 c32rtomb 使用 UTF-32 编码 (宏常量) | 
参见
| 
          
           
            C 文档
           
          
          关于
          
           
            以空字符结尾的多字节字符串
           
          
          |