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