考虑wctomb(),它采用宽字符并编码为当前选定的字符集。 glibc手册页指出输出缓冲区应为MB_CUR_MAX,而FreeBSD手册页指出输出缓冲区大小应为MB_LEN_MAX。这在哪里是正确的?
是否有任何示例宽字符/编码组合,其中需要多个编码字符来表示宽字符?
更一般地说,MB_CUR_MAX是指最大组合编码字符数字数来表示宽字符,还是仅表示任何特定编码字符的最大字节数?
答案 0 :(得分:3)
MB_CUR_MAX
是正确的,但两者都足够大。如果要避免变长数组声明,可能需要使用MB_LEN_MAX
。
MB_CUR_MAX
是当前语言环境中多字节字符的最大字节数。 MB_LEN_MAX
是任何支持的语言环境的字符中的最大字节数。与MB_CUR_MAX
不同,MB_LEN_MAX
是一个宏,因此可以在不创建VLA的情况下在数组声明中使用。
两个常量都指一个宽字符。由于多字节编码可以包括移位序列,因此没有简单定义多字节字符的确切含义。如果多字节语言环境包括移位序列,则具有特定宽字符的特定呼叫wctomb
所需的字节数可能因呼叫而异,具体取决于移位状态。 (另外,实际代码在不同的班次状态下可能会有所不同。)
据我所知,没有任何东西阻止将宽字符转换为多字节序列,该序列可以分解为其他多字节序列(与Unicode组合一样); wctomb
的定义仅涉及“代表”。但我不知道有哪个实现呢?必须使用单独的API完成Unicode规范分解。
因此,没有安装的语言环境可能需要与MB_LEN_MAX
一样大的值。但是没有什么可以阻止你添加语言环境 - 甚至创建自己的语言环境 - 前提是它们不超过编码限制(Linux上为16字节)。