【问题标题】:How does HTML parse <font color="testing">? [duplicate]HTML如何解析<font color="testing">? [复制]
【发布时间】:2014-01-21 23:26:19
【问题描述】:

参考Why does HTML think “chucknorris” is a color?

下面的分析正确吗?

  1. 首先,将所有非十六进制字符替换为“0”。

    测试 -> 0e00000

  2. 如果它不能被 3 整除,则追加 '0'。

    0e00000 -> 0e0000000

  3. 然后分成3个相等的组。

    0e0000000 -> 0e0 000 000

  4. 然后获取每组的前 2 个字符并将它们连接在一起以获得您的颜色代码。

    0e0 000 000 -> 0e0000

#0e0000 接近黑色。

但是如果你使用这个网站并且输入字体颜色为“测试”,它会显示为红色阴影:http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_font_color

我有什么遗漏吗?

在回答后附加:

我正在编写一个需要我将 font color = "" 解析为颜色代码的 Android 应用程序。我将我拼凑的算法放在这里以供将来参考:

public String getColourCode(String nonStandardColour) {
    String rtnVal = "#000000";
    
    // first replace all non-hex characters
    String converted = nonStandardColour.toLowerCase().replaceAll("[g-z]", "0");

    System.out.println(nonStandardColour + " is now " + converted);
    System.out.println("Length: " + converted.length());
    
    if (converted.length() <= 3) {

        // append "0"s if length != 3
        while (converted.length() !=3) {
            converted = converted + "0";
        }

        System.out.println("Converted colour is now " + converted);

        // Length is 3, so split into 3 characters and prepend 0 to each
        String[] colourArray = new String[3];
        colourArray[0] = "0" + convertedOpNickColour.substring(0, 1);
        colourArray[1] = "0" + convertedOpNickColour.substring(1, 2);
        colourArray[2] = "0" + convertedOpNickColour.substring(2, 3);
    
        rtnVal = "#" + Integer.toHexString(Color.rgb(
                            Integer.parseInt(colourArray[0], 16), 
                            Integer.parseInt(colourArray[1], 16), 
                            Integer.parseInt(colourArray[2], 16)));
    }

    else { // converted.length() is >= 4

        System.out.println("Appending 0s until divisible by 3");

        while(converted.length() % 3 != 0) {
            converted = converted + "0";
        }

        System.out.println("Converted colour is now " + converted);

        // divide into 3 equal groups
        List<String> colourArray2 = new ArrayList<String>();
        int index = 0;              
        while (index<converted.length()) {
            colourArray2.add(converted.substring(
                index, Math.min(index(converted.length()/3),converted.length())));
            index+=(converted.length()/3);
        }

        System.out.printf("The 3 groups are:");
        System.out.printf(colourArray2.get(0));
        System.out.printf(colourArray2.get(1));
        System.out.printf(colourArray2.get(2));

        // if the groups are e.g. 0f0 0f0 0f0
        if (rgbColour.get(0).length() >=3 ) {
            rtnVal = Integer.toHexString(Color.rgb(
                Integer.parseInt(colourArray2.get(0).substring(0,2), 16), 
                Integer.parseInt(colourArray2.get(1).substring(0,2), 16), 
                Integer.parseInt(colourArray2.get(2).substring(0,2), 16)));
          
            // remove alpha
            System.out.println("rtnVal is #" + rtnVal.substring(2));
            return "#" + rtnVal.substring(2);
        } 
        
        // groups are e.g. 0f 0f 0f
        else {
            rtnVal = Integer.toHexString(Color.rgb(
            Integer.parseInt(colourArray2.get(0), 16), 
            Integer.parseInt(colourArray2.get(1), 16), 
            Integer.parseInt(colourArray2.get(2), 16)));

            System.out.println("rtnVal is #" + rtnVal.substring(2));
            return "#" + rtnVal.substring(2);
        }
    }
    return rtnVal;
}

【问题讨论】:

    标签: java html fonts colors


    【解决方案1】:

    它实际上是将其拆分为 RGB 值,而不是十六进制颜色值。所以你不是在创建#0e0000,而是在创建RGB(0e0, 000, 000)。因为我们知道000 只是0,我们只需要查看0e0 部分。从这里开始,如果有超过 2 位数字,您需要将前导的 0s 删除到两位数,然后截断到数字中的左侧两位数,即为 e0。当您将其从十六进制转换为十进制时,您最终会得到e0 = 224。这给你的是RGB(224, 0, 0),或者大部分是红色。

    更多示例:

    eesting   => ee00000   => ee0 000 000 => RGB(ee0, 000, 000) => RGB(ee, 00, 00) => RGB(238, 0, 0)
    eeeting   => eee0000   => eee 000 000 => RGB(eee, 000, 000) => RGB(ee, 00, 00) => RGB(238, 0, 0)
    eeeeing   => eeee000   => eee e00 000 => RGB(eee, e00, 000) => RGB(ee, e0, 00) => RGB(238, 224, 0)
    eefeefeef => eefeefeef => eef eef eef => RGB(eef, eef, eef) => RGB(ee, ee, ee) => RGB(238, 238, 238)
    teeteetee => 0ee0ee0ee => 0ee 0ee 0ee => RGB(0ee, 0ee, 0ee) => RGB(ee, ee, ee) => RGB(238, 238, 238)
    0f0f0f    => 0f0f0f    => 0f 0f 0f    => RGB(0f, 0f, 0f)    => RGB(0f, 0f, 0f) => RGB(15, 15, 15)
    tftftf    => 0f0f0f    => 0f 0f 0f    => RGB(0f, 0f, 0f)    => RGB(0f, 0f, 0f) => RGB(15, 15, 15)
    ttfttfttf => 00f00f00f => 00f 00f 00f => RGB(00f, 00f, 00f) => RGB(0f, 0f, 0f) => RGB(15, 15, 15)
    

    【讨论】:

    • 啊,明白了。谢谢! :)
    • @Terence 我对答案进行了一些更新,以澄清其他一些情况。
    【解决方案2】:

    是的,您是对的,它使用以下解析算法和以下步骤 首先,删除所有哈希标记,然后将所有非十六进制字符 (0-9a-f) 替换为 0。

    例如:#DIXIT 变为 D0000。

    对于长度 1-2,右填充 3 个字符并用 0 填充。

    例如:“0F”变成“0F0”,“F”变成“F00”。

    对于长度 3,将每个数字作为红色、绿色或蓝色的值,并在该值前面加上 0。

    例如:"0F0" 变成 RGB(0, F, 0),它变成 RGB(00, 0F, 00) 或 000F00。

    此时任何长度小于 4 位的值都已完成。

    对于长度为 4 或更长的字段,该字段用 0 右填充到下一个完整的 3 倍数。此步骤对于较长的字段很重要。

    例如:“0F0F”变成“0F0F00”

    接下来,字符串被分成三个偶数部分,从左到右分别代表红、绿、蓝。

    “0F0F00”的行为符合预期,变为 RGB(0F, 0F, 00)。至此,任何 6 个字符的字符串都完成了。

    验证上面的东西click here

    要测试以下样本的算法检查,您将得到相同的结果

    <body bgcolor="DIXIT">
    <body bgcolor="D00000">
    

    将执行以下步骤来解析 dixit

    1. 用 0 替换非十六进制值 例如 D0000
    2. 对于长度为 4 或更长的字段,该字段用 0 右填充到下一个完整的 3 倍数。此步骤对于较长的字段很重要。 所以现在“D0000”将是 RGB 格式的“D0 00 00”。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2012-10-29
      • 1970-01-01
      • 2012-10-25
      • 2012-02-07
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多