【发布时间】:2012-06-16 12:17:42
【问题描述】:
我进行了一些研究,但没有找到问题的答案。我想知道如何确定 C 程序中使用的字符集是否为 ASCII。有没有预处理器常量?
非常感谢。
【问题讨论】:
标签: c character-encoding ascii
我进行了一些研究,但没有找到问题的答案。我想知道如何确定 C 程序中使用的字符集是否为 ASCII。有没有预处理器常量?
非常感谢。
【问题讨论】:
标签: c character-encoding ascii
C 说:
(C99, 5.2.1p1) "执行字符集成员的值是实现定义的。"
例如gcc 说:
执行字符集(C90 和 C99 5.2.1)成员的值。 由 ABI 确定
http://gcc.gnu.org/onlinedocs/gcc/Characters-implementation.html
所以gcc 指向操作系统文档。
【讨论】:
据我所知,ASCII 字符集的范围是 0 - 127,而其他字符集小于零。
【讨论】:
char 可以是无符号的,在这种情况下,其他字符大于 127,而不是小于零。原则上,C 实现需要对 0-127 的值使用 ASCII,例如,已经有使用 EBCDIC 的实现。
这取决于您使用的工具链,您可以在工具链文档中找到它。例如,vc++ 为 unicode 构建定义 _UNICODE。
【讨论】:
很容易自己构造一个预处理器宏。像下面这样的东西应该可以解决问题:
#define HAVE_ASCII (('\x41' == 'A') && ('\x61' == 'a') && ('\x30' == '0'))
#if !HAVE_ASCII
# error "we need ascii"
#endif
如果您想非常小心,您可以在宏中列出所有可打印的 ASCII,但这里应该已经足以与 EBCDIC 区分开来。如果您只是确定您是否在 EBDIC 系统上,则更容易:)
#define HAVE_EBCDIC (('Z' - 'A') != 25)
【讨论】: