为什么我不应该使用 Unicode 字符来模拟排版样式(例如小型大写字母或脚本)?

Wrz*_*mft 127 unicode text-formatting special-characters

Unicode 包含各种字符,这些字符看起来像是基本拉丁字母表字符的排版风格变体,并且允许人们以相应的排版样式编写文本,而无需求助于标记或类似方法。例如,可以模拟:

  • 小帽子:

    ???????????????y ??????? ??X?。

  • 脚本:

    .

  • 黑信:

    .

这满足了 Stack Exchange 的兴趣(例如,hereherehere)并且对此类技术提出了批评。但是当我使用它们时会出现什么问题呢?

Wrz*_*mft 225

一般的

这些字符不是用于常规拉丁字母文本,而是用于语音、西里尔字母文本、用作数学符号(代表变量)或类似的。在基本拉丁字母表中对文本进行编码的唯一符合 Unicode 的方法是使用主要用于此目的的字符(即,来自基本拉丁语Unicode 块)。

与许多其他标准一样,您应该三思而后行违反 Unicode。此外,Unicode 包含如此多的书写系统、用例和内容,它们只是为了与其他标准1向后兼容而存在的,因此完全理解其所有动机是一门科学。长话短说,除非您真的真的知道自己在做什么,否则很可能会发生一些您甚至没有想到的事情。

具体例子

无障碍

编码文本不仅存在以某种字体呈现。它也可以被解释,例如,通过屏幕阅读器。屏幕阅读器不需要猜测是否

意味着是变量 , 和 –的定冠词或数学乘积2,这就是这些字符的用途。因此,最好的行为是将这些字符拼写出来,例如字面意思如下:

粗体字小 t、粗体字小 h、粗体字小 e

它不应该只是说“the”,因为那样它就不能正确阅读那些符号恰好形成一个可发音单词的数学文本。3

可移植性

如果您的文本在您的机器上得到了很好的呈现,这并不意味着它也将出现在读者的机器上。最明显的例子是阅读器没有任何支持这些字符的字体,或者文本是由不支持后备字体的软件呈现的。不可否认,这正变得越来越不常见。但请记住,有些人像阅读障碍者需要不太可能支持这些字符的特殊字体。

但即使读者的机器只使用不同的字体,这也可能使文本的可读性大大降低。对于第一个例子,这是?用两种不同的字体呈现:

?  用 FreeSerif 和 STIX 渲染

Free Serif 渲染文本,就像您在使用特殊字符模拟文本时可能希望它渲染的那样,即用连续笔画模拟手写。然而,这些字符是作为数学符号使用的,连接是没有意义的。因此,专为数学目的而设计的STIX渲染更符合这些字符的用途。

第二个示例中,假设您或读者将“??? ?你???” 因为某些原因。使用好的字体,您将获得4

??? ?你??? 以直立和斜体呈现。 斜体读作“暨我的酒吧”

这样做的原因是小型大写字母(部分)用西里尔字母模拟,而西里尔斜体有时看起来与直立的斜体非常不同。再说一次,这是正确的行为。

可搜索性

作为第一个示例,考虑您希望对字符(数学脚本W)进行合理的搜索做什么。假设搜索有两种模式,默认模式精确模式(通常称为case-sensitive)。这个字符应该是:

  • 在默认模式下搜索wW时找到- 对于那些不想打扰将特殊字符输入或复制粘贴到搜索字段中的人;

  • 以精确模式搜索时找到 - 对于那些想要搜索数学文档中提到相应变量的人³;

  • 由于破坏了与上述类似的搜索,在精确模式下搜索 , wW时未找到。

但是如果用这个字符来模拟正则文本,应该是在搜索W或者exact模式的时候发现的,和上面的有冲突。

作为第二个例子,考虑在搜索拉丁字符时永远不应该找到西里尔字符,反之亦然,因为它们完全不同。但是,如果使用 Cyrillic 字符来模拟拉丁小写字母,如果您不想破坏可搜索性,则需要这样做。如果人们搜索一个罕见的拉丁字母单词,而这恰好对应于一些流行的西里尔字母单词的人造小写字母,这将导致人们发现很多无用的东西(反之亦然)。

精确搜索选项不能解决这个问题,因为这在这些字母表中被保留用于其他目的。

一般来说,不可能通过使用特殊字符来模拟样式化拉丁文本来构建不被破坏的搜索(没有大量选项)。


1?你知道XKCD关于统一标准不可避免的失败吗?嗯,Unicode 成功了。
2 ? 或相关约定中的任何空运算符
3 ? 我知道现在很少有数学文本支持这种编码或与之兼容的东西,但关键是有一天他们希望这样做。您的 Unicode 滥用文本可能仍然存在并在那时阅读。
4 ? 除非您针对马其顿语或塞尔维亚语进行本地化,否则您会得到不同但仍不理想的结果。

  • 您的 small-cpas 示例提出了一个难题/竞争:找到一个有效的句子,当斜体时变成不同的句子......(都由人类拉丁语读者解释) (3认同)
  • @posfan12:它被用作一个独特的数学字母表——就像脚本字符一样。(请注意,此处的示例编号与问题中的要点无关。) (2认同)

And*_*ton 69

会出什么问题?嗯,我看到这个:

在此处输入图片说明

在 Windows 7 上的 Firefox 50.1.0 中。

在这种情况下,在移动设备上丢失字形的问题在用户Chris Kent评论中给出的图像中得到了进一步说明,我从原始图像中裁剪并调整了大小:

在此处输入图片说明

用户oals好心地贡献了另一个例子:

在此处输入图片说明

  • @Lilienthal 在 2020 年的某个时候,Firefox 主要版本号可能需要 64 位数字。不久之后,版本号将比实际程序占用更多空间。为了重新获得市场份额,Chrome 版本号将需要整个星球来存储它们。 (16认同)
  • 我?https://i.stack.imgur.com/lWRAa.png (10认同)
  • @Lilienthal 我对您没有检查或安装更新已经过去了多少年印象深刻。我的意思是,我仍然在某些设备上使用基于 Firefox 3.5 的东西,但我在这件事上没有选择(设备太好了,但没有更新的可用浏览器可用) (7认同)
  • @Zach Lipton:你有没有意识到这在我的优先事项清单上?#1 有一些我可以实际使用的东西。尽管 Firefox 人(和许多其他人)可能已经接受了一种新范式:通过不可用性来确保安全。 (3认同)
  • 你们知道使用如此古老的浏览器会暴露多少已知和活跃的安全漏洞吗? (2认同)

Mic*_*ton 29

我在这方面遇到了 XY 问题。

Y 和 X 看起来比文本的其余部分小

在这里,我们看到 Y 和 X 看起来比文本的其余部分小。在某些缩放级别,它们看起来大小相同,但这似乎暴露了这种特定字体中这些特定字形的问题。

  • 在“XY 问题”中为笑点赞 :) (19认同)
  • @Wrzlprmft:根据定义,它们是 unicode 滥用,因为 unicode 没有小写字母。unicode 所具有的是在拼音字母块和拉丁文扩展 D 块中看起来像小写字母的字母。具体来说,两个拼音块和拉丁文扩展 D 块都不包含看起来像小写字母 **X** 的字母,因此我猜测 **X** 来自其他地方,可能是西里尔字母块。差异不是由 1、2 或 3 引起的。它是由属于另一个字母表的字母引起的。 (12认同)

CCT*_*CTO 14

使用有点像拉丁字符的非拉丁字符会使您置身于垃圾邮件发送者、色情贩子以及不知道他们在做什么的伪装者的陪伴下,他们希望他们的文本无法搜索、无法索引和可否认。(“我从来没有说过它是安全的!我说它是 sigma-alpha-integral-sign-epislon!不能起诉我!!!”)

如果你在那个俱乐部很舒服,那就去吧。