ænd*_*rük 14 html url-parsing w3c-validation emoji
我\xe2\x80\x99m 试图理解为什么某些 HTML 属性未通过 W3C 验证。我在真实的代码库中遇到了这个问题,但这里\xe2\x80\x99s是一个最小的复制:
\n<!DOCTYPE html><html lang="en"><head><title>a</title></head><body>\n\n<img alt="1" src="\xe2\xad\x90">\n<img alt="2" src="/\xe2\xad\x90">\n<img alt="3" src="/a\xe2\xad\x90">\n<img alt="4" src="/a/\xe2\xad\x90">\n<img alt="5" src="">\n<img alt="6" src="/"> <!-- Only this is invalid. -->\n<img alt="7" src="/a">\n<img alt="8" src="/a/">\n\n</body></html>\nRun Code Online (Sandbox Code Playgroud)\nW3C 验证器仅报告一个错误,影响第六张图像:
\n\n\n\n
\n- \n
错误:元素
\n/属性值错误:路径段中存在非法字符:不允许。srcimg?Run Code Online (Sandbox Code Playgroud)\n<img alt="6" src="/">\n
为什么只有这个有问题,其他的没有?\xe2\x80\x99 有什么不同?
\nsid*_*ker 13
问题中描述的行为是由检查器(验证器)代码中的错误引起的,现已修复\xe2\x80\x99s;请参阅https://github.com/validator/galimatias/pull/2。由于测试套件没有覆盖以斜线开头的相对 URL,后跟大于 U+FFFF \xe2\x80\x94 的代码点(如 U+1F30(彩虹)),因此该错误未被注意到。问题中的人物。因此,测试套件也进行了更新,以增加该案例的覆盖范围;请参阅https://github.com/web-platform-tests/wpt/pull/36213。
\n顺便说一句, U+2b50 (\xe2\xad\x90) 情况不受 \xe2\x80\x99t 影响,而 U+1F308 () 情况则受该错误影响的原因是:Java 使用UTF-16,而 U+1F308 是在所谓的增补字符范围内(即 U+FFFF 以上的代码点集),因此 \xe2\x80\x94 如 UTF-16 代码中的 \xe2\x80\x94 上面的注释中所述点 U+1F308 由两个值的代理对表示char,而 U+2b50 由单个值表示char。
char值的数量差异影响 URL 解析方式的原因是 HTML checker\xe2\x80\x99s URL 解析代码中的状态机维护字符索引并在状态更改期间递减它。因此,如果它\xe2\x80\x99s 处理可以包含 U+FFFF 以上代码点的 URL 段,它必须聪明地知道将索引减少多少个字符 \xe2\x80\x94 它需要将其减少对于 U+FFFF 以上的代码点为 2,否则为 1。
为此,代码有一个decrIdx()方法调用Character.charCount():
\n\n确定
\nchar表示指定字符(Unicode 代码点)所需的值的数量。如果指定的字符等于或大于 0x10000,则该方法返回 2。否则,该方法返回 1。
因此,对检查器进行的代码更改用更智能的调用取代了idx--索引值的简单递减。Character.charCount()decrIdx()