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

时间:2013-03-15 06:27:55

标签: c character-encoding multibyte widechar

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

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

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

1 个答案:

答案 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完全不符的编码问题。”