为啥十六进制数字以#而不是0x为前缀?

Posted

技术标签:

【中文标题】为啥十六进制数字以#而不是0x为前缀?【英文标题】:Why are hex numbers prefixed with # instead of 0x?为什么十六进制数字以#而不是0x为前缀? 【发布时间】:2020-07-23 09:13:20 【问题描述】:

由于任何 RGB 值都只是一个 24 位整数,因此将颜色表示为单个十六进制数字是完全有意义的。既然约定的十六进制数字前缀是 0x,为什么我们要为颜色引入 new 前缀 (#)?

【问题讨论】:

【参考方案1】:

据我所知,十六进制表示法源自 X11(X Window System),它的历史可以追溯到 1987 年,当时 Linux 和 WWW 还没有出现。

这是 Xlib 手册中的相关页面:


最终选择它的原因可能是因为基于 Unix 的系统是当时学术界首选的操作系统,他们熟悉这种表示法,并考虑使用已经支持的东西而不是重新发明***。

当第一个网络浏览器问世时,它只是纯文本。一些浏览器为您提供了设置背景和文本颜色的选项,但它不是网页的一部分。但有些人想要背景颜色:

“Mosaic 具有更改页面背景颜色的功能 首选项。我问 NCSA 是否可以让他们的程序读取“页面 颜色”标签,然后适当地设置页面颜色。他们告诉我 将更改 html 规范,然后他们才会支持它。” Bradford Bohonus(1994 年 9 月 22 日)

当然,HTML 背后的整个想法是分离结构和表示,所以这不会发生。在 HTML 2.0(1995 年)发布之前,样式表的想法很快就出现了。

有很多关于样式表的提案,一个早期的提案实际上确实使用了0x 十六进制表示法:

Rob Raisch (raisch@ora.com)
Thu, 10 Jun 1993 15:23:20 -0400
...
(fo) foreground= COLOR DEFAULT:''
Describes the recommended foreground color representation
for a character. Colors are specified as 'inherit', text
names, (eg. black, white, magenta), or as RGB color
values in hexidecimal, (eg. 0x000000, 0xffffff, 0xff00ff)

(ba) background= COLOR DEFAULT:''
Describes the recommended background color representation
for a character. Colors are specified as 'inherit', text
names, (eg. black, white, magenta), or as RGB color
values in hexidecimal, (eg. 0x000000, 0xffffff, 0xff00ff)
...

另一个名为“HTML 样式表”的提案(Joe English,1994 年)提出了以下建议:

样式表使用的所有颜色都必须在(可选)COLORS元素中声明。此元素包含一个或多个 COLOR 元素,每个元素指定一种颜色。

COLOR 元素有两个必需的属性:ID(唯一标识符)和 RGB(定义 颜色。颜色由 ID 引用。

颜色由它们的红色、绿色和蓝色分量使用 X11 十六进制表示法定义:一磅 符号后跟 3、6、9 或 12 个十六进制数字。这些数字被解释为三组 1、2、 3 或 4 个半字节,第一个指定红色分量,第二个指定绿色,第三个指定蓝色。十六进制 数字 A 到 F 可以是大写或小写。

<colors>
<color id=red rgb="#F00">
<color id=green rgb="#00FF00">
<color id=blue rgb="#000000000FFFFF">
<color id=grey rgb="#c0c0c0">
<color id=white rgb="#FFFFFF">
</colors>

虽然没有直接归因于 Joe English,但最终在 CSS1 草案和最终建议中使用了 #RGB 和 #RRGGBB 十六进制表示法,您可以在此处查看:https://www.w3.org/Style/CSS/history.html。

就个人而言,我认为这可能与使用特定规则(#RGB 与 #RRGGBB)解析文本的词法分析有关,而不是像在 C/C++ 源代码中那样表示原始数据。在 CSS 规范草案中,它定义了解析“hexcolor”所需的规则:

h               [0-9a-fA-F]
hexcolor        #hhh|#hhhhhh|#hhhhhhhhh

所以基本上他们想要一个表示颜色代码的文本定义,而现有的 X11 规范符合要求。由于像 0xCAFE$CAFECAFEh 这样的十六进制表示法用于表示无特征的原始数据,因此对那些已经存在的表示法施加更严格的规则可能会导致混淆。

【讨论】:

以上是关于为啥十六进制数字以#而不是0x为前缀?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用十六进制常量?

C语言 ASCII码的问题 高手请进~

您如何在 ruby​​ 中编写二进制文字?

Javascript-基本类型

如何将十六进制字符串转换为十六进制数字

为啥使用 C printf 格式“%#x”打印 0(零)而没有前导“0x”?