gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:33:10 26 4
gpt4 key购买 nike

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

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

gcc 选项 -fwide-exec-charset 是否决定了 mbtowc() 使用的宽字符集,就像它在编译时所做的那样?

最佳答案

简短回答:用于宽字符串的字符集由编译时已知的 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 的宽度。您还可以根据处理器表示 wchar_t 的字节序将其描述为小端或大端。但这些是平台的属性,您无法在运行时更改这些属性,就像您无法更改字节序或将 ASCII 更改为 EBCDIC 一样。

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

关于c - gcc 在调用 `mbtowc()` 时如何决定宽字符集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15426114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com