gcc在调用`mbtowc()`时如何决定宽字符集?

spo*_*ang 5 c character-encoding multibyte widechar

根据 gcc 手册,该选项-fwide-exec-charset在编译时指定宽字符串和字符常量的宽字符集。

但是mbtowc()在运行时调用将多字节字符转换为宽字符时,宽字符集是什么?该POSIX标准说,设置的多字节字符的字符是由当前语言环境的LC_CTYPE种类来确定的,但没有约宽字符集说。我现在手头没有 C 标准,所以我不知道 C 标准对此有何看法。

gcc 选项是否像在编译时那样-fwide-exec-charset确定 使用的宽字符集mbtowc()

use*_*342 5

简短回答:用于宽字符串的字符集由wchar_t编译时已知的特征决定。与mbtowc库函数一样,这会在构建 libc 时发生。

mbtowc从以外部字符集编码的字符串中读取单个字符,并将其写出一个wchar_t能够表示任何字符的值。同样,mbstowcs将外部编码的 C 字符串转换为简单的wchar_t. 从系统的角度来看,指定生成的宽字符/字符串的“字符集”是没有意义的,因为以任何方式更改其输出编码都会破坏生成的宽字符串作为wchar_t.

可以描述 mbstowcs为产生固定宽度的Unicode编码如UCS-2或UCS-4(或更精确地UTF-16或UTF-32),如果宽字符对应于ISO 10646个代码点,并且根据的宽度wchar_t。您也可以将其描述为 little-endian 或 big-endian,具体取决于处理器对wchar_t. 但这些是平台的属性,您无法在运行时更改这些属性,就像您无法更改字节顺序或将 ASCII 更改为 EBCDIC 一样。

-fwide-exec-charset用于向编译器显式指定与 array-of- 的内部表示相对应的字符集wchar_t。当它与编译器通常生成的表示不同时(因为您正在交叉编译,或者因为编译器配置错误),这很有用。这就是为什么手册继续警告“您将遇到不完全适合的编码问题wchar_t。”