【发布时间】:2014-01-26 14:35:11
【问题描述】:
在 C++ 编程语言 6.2.3 中,它说:
可以安全地假设实现字符集包括 十进制数字、英文的 26 个字母字符和一些 的基本标点符号。假设是不安全的 那:
8 位字符集中的字符数不超过 127 个(例如,某些字符集提供 255 个字符)。
没有比英语提供更多的字母字符(大多数欧洲 语言提供更多,例如æ、þ和ß)。
字母字符是连续的(EBCDIC 在“i”和“j”之间留有间隙)。
用于编写 C++ 的每个字符都可用(例如, 一些国家字符集不提供 {、}、[、]、| 和 \)。
一个字符适合 1 个字节。有嵌入式处理器 没有字节访问 char 为 4 个字节的硬件。还有,一个 可以合理地为基本字符使用 16 位 Unicode 编码。
我不确定我是否理解最后两个陈述。
在标准的第 2.3 节中,它说:
基本源字符集由 96 个字符组成:空格 字符,代表水平制表符的控制字符, 垂直制表符、换页和换行,以及以下 91 个图形 字符:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) % : ; . ? * + - / ^ & | ! = , \ " '
...基本执行字符集和基本执行宽字符集应分别包含基本执行字符集的所有成员 源字符集,加上代表警报的控制字符, 退格和回车,加上一个空字符(分别, null 宽字符),其表示全为零。
我们可以看到,标准规定像 { } [ ] | 这样的字符。 \ 是基本执行字符集的一部分。那么为什么 TC++PL 说假设这些字符在实现的字符集中可用是不安全的呢?
对于字符的大小,在标准的第 5.3.3 节中:
sizeof 运算符产生对象中的字节数 其操作数的表示。 ... ...
sizeof(char)、sizeof(signed char)和sizeof(unsigned char)是 1。
我们可以看到标准规定一个 char 是 1 个字节。 TC++PL 在这里试图说明什么?
【问题讨论】:
-
关于
char的大小,它总是1,但这并不一定意味着它是一个字节。 -
并且假设字母表中的数字或字符序列是连续的是不安全的。正如您所说,EBCDIC 在编码中留下了一个空白,但它仍然是有效的源编码。 (如果我没记错的话,IBM 大型机仍然使用 EBCDIC。)
-
感谢您的回复。该标准说“sizeof 运算符产生其操作数的对象表示中的字节数。”那为什么 sizeof(char)==1 并不意味着它是一个字节? @joachim-pileborg
-
char类型是一种特殊情况。您可能想阅读例如this old SO question. -
关于
{、}、[、]等不可用,例如:您正在为带 LCD 显示屏的数字温度计编写软件,您编写代码并编译它使用具有这些字符的PC。这并不意味着运行此代码的设备(温度计)将支持显示这些字符。要点是:开发系统!=目标系统。