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

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

【问题讨论】:

    标签: hex


    【解决方案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        #{h}{h}{h}|#{h}{h}{h}{h}{h}{h}|#{h}{h}{h}{h}{h}{h}{h}{h}{h}
    

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

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多