屏幕阅读器是否理解 HTML 转义字符(如双引号的 “)?

Do screen readers understand HTML escape characters (like " for double quotes)?

提问人:Evry 提问时间:7/26/2023 更新时间:7/27/2023 访问量:140

问:

我正在更新一个 aria-label 值方法,该方法当前正在转义该值,以便在 HTML 元素属性中安全使用。

因此,例如,它将转换为 。<span> abc"&lt;span&gt; abc&#34;

问题是 JAWS 按原样读取它,它不会翻译编码。

这是所有(或大多数)屏幕阅读器的特征吗?或者这只是一个错误?

我对此的最初解决方案是将需要(或通常)转义的符号(<,>、“、' 和 &)转换为其名称(例如,<将转换为”小于“)。这是一个有效的解决方案吗?

HTML 辅助功能 屏幕阅读器 jaws-screen-reader

评论


答:

1赞 slugolicious 7/26/2023 #1

所以你要包括HTML实体吗?我不确定我是否遵循这种情况。咏叹调标签只是按原样宣布,特殊字符不必转义。因此,如果你想让咏叹调标签说“<span>”,你可以只用.aria-label 不会呈现,因此无需转义任何内容。aria-labelaria-label="<span>"

现在,大多数屏幕阅读器都有“详细”设置,因此默认情况下不会读出某些标点符号和特殊字符,但用户可以完全控制它。因此,在示例中,屏幕阅读器可能只说“span”。但是,如果用户更改其详细程度以读取所有特殊字符,则可能会显示“小于、跨度、大于”。aria-label="<span>"

评论

0赞 Robin Zigmond 7/27/2023
“咏叹调标签没有渲染,所以没有什么可以转义的。”我不是OP,但我认为这不一定是对的。这听起来像是他们正在使用某种通用函数将属性直接插入到 HTML 中,在这种情况下,它必须对某些字符进行转义,以免有人输入 .(当然,这取决于谁可以提供这种输入,但大多数此类实用程序都非常正确地谨慎行事。我同意,如果标签是由JS设置的,那就没有问题了。aria-labelfoo" <script>/* some evil JS */</script> foo="
0赞 Robin Zigmond 7/27/2023
刚刚意识到我尝试的注入攻击是畸形的,因为你不能在 HTML 元素标签中有一个脚本,但这并不能反驳我的观点——一个比我更聪明的攻击者可以很容易地关闭标签,完成虚拟内容,然后插入他们的脚本。关键是,当你通过字符串连接来构建 HTML 时,你总是容易受到这样的攻击。
0赞 slugolicious 7/28/2023
@RobinZigmond aria-label 没有呈现的哪个部分不正确?除非您打开了字幕面板以进行画外音或 nvda 或 jaws 中的类似功能,否则它永远不会显示。
0赞 Robin Zigmond 7/28/2023
我不是在质疑那部分,而是你从中得出的结论,即“没有什么可以逃避的”。无论如何,从再次阅读 OP 来看,它是否真的需要在这里转义并不重要,事实是 OP 使用的任何功能/实用程序都在这样做。
0赞 slugolicious 7/28/2023
咏叹调标签中没有任何内容需要逃脱,这仍然是准确的。它只是由屏幕阅读器读出的纯文本,因此您无需将“<”替换为“<”
0赞 QuentinC 7/27/2023 #2

你的意图不是很清楚,但是:

  • 与所有其他 HTML 属性一样,aria-label 的内容原则上只能是纯文本。不允许使用 HTML。因此,如果您的内容直接由屏幕阅读器按原样拍摄,这是完全正常的。
  • 除了在特定的上下文中,如编程、数学等有意义的上下文,在标签中包含特殊符号(如“<”)通常是一个坏主意。标签必须只是纯文本,不应该有任何无用的装饰。对于屏幕阅读器用户来说,这只是噪音。
  • 通常,通过字面描述来替换完全可读/可访问的符号是一个非常糟糕的主意。

关于第 1 点:如果您需要在标签中添加 HTML,请考虑将 aria-label 更改为 aria-labelledby 并引用实际的 HTML 元素,该元素可能位于屏幕外/视觉上隐藏,您可以在其中完全自由地使用 HTML。 如果您需要添加换行符 (\n) 或制表符 (\t),也请考虑该解决方案,因为 aria-label 可能也不支持它们。

请注意,将 HTML 放在 title 属性中似乎在某些框架中非常流行,但实际上完全错误,并且会导致屏幕阅读器读取 HTML 代码。

关于第3点: 通常,用文字描述来替换一个完全可读/可访问的符号是一个非常糟糕的主意。 在许多语言中,这些符号可以有不同的名称,如果用户没有得到与以前相同的名称,他/她会感到困惑。例如,“<”可以看作是“小于”,也可以看作是“开角括”或“左角括”。 此外,它会让盲文用户倍感困惑,因为他们会从字面上阅读盲文显示器上完整写的“小于”,而不是他们习惯的单个盲文“<”字符。无论是在“<”有意义的地方,这充其量只是浪费时间和精力来理解它的实际含义。

评论

0赞 Robin Zigmond 7/27/2023
虽然你说的大部分内容都不准确,但我认为你误解了OP的情况。我不认为他们想将 HTML 注入 aria-label,只是为了使用他们使用的实用程序将替换为 HTML 实体的特殊字符(出于完全合法的安全原因),从而失去它们对屏幕阅读器的意义。但是,我同意你的看法,像“<”这样的字符通常不应该成为标签的一部分,所以如果没有看到一个具体的例子,就很难看到真正的问题。
0赞 Evry 7/27/2023
感谢您的回答 QuentinC。好吧,我实际上忘记了翻译成其他语言。好吧,我没有理由让客户想要在值中插入 html 标签,但有可能,我工作的应用程序不会检查这一点。
0赞 Evry 7/27/2023
如果下面的注释关于未在 aria-label 中呈现的内容是正确的,那么我担心的只是引号,如果字符串中存在,则关闭属性
0赞 Robin Zigmond 7/27/2023
*迟到的更正,但在我之前评论的第一句话中,我的意思是说.对于无意中的轻微,我们深表歉意!While much of what you say is *accurate*