根据 gcc 手册,该选项-fwide-exec-charset
在编译时指定宽字符串和字符常量的宽字符集。
mbtowc()
但是通过在运行时调用将多字节字符转换为宽字符时,宽字符集是什么?POSIX 标准说多字节字符的字符集由当前语言环境的 LC_CTYPE 类别决定,但对宽字符集只字未提。我现在手头没有 C 标准,所以我不知道 C 标准对此有何评论。
gcc 选项是否像在编译时一样-fwide-exec-charset
确定 使用的宽字符集?mbtowc()
根据 gcc 手册,该选项-fwide-exec-charset
在编译时指定宽字符串和字符常量的宽字符集。
mbtowc()
但是通过在运行时调用将多字节字符转换为宽字符时,宽字符集是什么?POSIX 标准说多字节字符的字符集由当前语言环境的 LC_CTYPE 类别决定,但对宽字符集只字未提。我现在手头没有 C 标准,所以我不知道 C 标准对此有何评论。
gcc 选项是否像在编译时一样-fwide-exec-charset
确定 使用的宽字符集?mbtowc()
简短的回答:用于宽字符串的字符集由wchar_t
编译时已知的特征决定。与mbtowc
库函数一样,在构建 libc 时会发生这种情况。
mbtowc
从以外部字符集编码的字符串中读取单个字符,并将其写入wchar_t
能够表示任何字符的值。同样,mbstowcs
将外部编码的 C 字符串转换为简单的wchar_t
. 从系统的角度来看,指定生成的宽字符/字符串的“字符集”是没有意义的,因为以任何方式更改其输出编码都会破坏生成的宽字符串作为wchar_t
.
如果宽字符对应于 ISO 10646 代码点,并且取决于 . 您还可以将其描述为 little-endian 或 big-endian,具体取决于您的处理器表示的字节序。但这些是平台的属性,您无法在运行时更改它们,就像您无法将字节顺序或 ASCII 更改为 EBCDIC 一样。mbstowcs
wchar_t
wchar_t
-fwide-exec-charset
用于向编译器显式指定与 array-of- 的内部表示相对应的字符集wchar_t
。当它与编译器通常生成的表示不同时,这很有用(因为您正在交叉编译,或者因为编译器配置错误)。这就是为什么手册继续警告“你会遇到不完全适合的编码问题wchar_t
”。