5

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

mbtowc()但是通过在运行时调用将多字节字符转换为宽字符时,宽字符集是什么?POSIX 标准说多字节字符的字符集由当前语言环境的 LC_CTYPE 类别决定,但对宽字符集只字未提。我现在手头没有 C 标准,所以我不知道 C 标准对此有何评论。

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

4

1 回答 1

5

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

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

如果宽字符对应于 ISO 10646 代码点,并且取决于 . 您还可以将其描述为 little-endian 或 big-endian,具体取决于您的处理器表示的字节序。但这些是平台的属性,您无法在运行时更改它们,就像您无法将字节顺序或 ASCII 更改为 EBCDIC 一样。mbstowcswchar_twchar_t

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

于 2013-03-15T07:18:49.497 回答