ChatGPT解决这个技术问题 Extra ChatGPT

如何防止 Unicode 字符在 JavaScript 中呈现为 HTML 中的表情符号?

我正在从 FileFormat.Info's search 中找到特殊字符的 Unicode。

一些字符呈现为经典的黑白字形,例如⚠(警告标志,\u26A0⚠)。这些更可取,因为我可以将 CSS 样式(例如颜色)应用于它们。

https://i.stack.imgur.com/mRrUw.png

其他人则呈现为较新的卡通表情符号,例如⌛(沙漏,\u231B⌛)。这些不是可取的,因为我无法完全设置它们的样式。

https://i.stack.imgur.com/niqCz.png

看来浏览器正在做出这种改变,因为我能够在 Mac Firefox 上看到沙漏字形,而不是 Mac Chrome 或 Mac Safari。

有没有办法强制浏览器显示较旧的(平面单调)版本来显示?

更新:似乎(根据下面的评论)有一个 text presentation selectorFE0E 可用于强制执行 text-vs-emoji。选择器作为不带空格的后缀连接到字符代码上,例如用于 HTML 十六进制的 ⌛︎ 或用于 JS 的 \u231B\uFE0E。但是,并非所有浏览器都支持它(例如 Chrome 和 Edge)。

您是否在 CSS 规则中设置了字体系列?
@janaspage ︎\uFE0E 是正确的(2 和 8)并且在 Safari(8 和 9)中工作正常,但就像答案所说:浏览器支持参差不齐,Chrome(46)完全坏了。
根本没有控制表情符号渲染的标准方法。
您所要做的就是强制使用包含此字符字形的字体,并且其字形看起来像您想要的那样(没有颜色,没有形状,或任何您喜欢的)。

A
Adam Katz

附加 Unicode variation selector 字符以强制文本,VS15,︎
这会强制将前一个字符呈现为文本而不是表情符号。

<p>🔒&#xFE0E;</p>

结果:🔒︎

了解详情:Unicode symbol as text or emoji


这非常有帮助,这就是我前几天投赞成票的原因。我想知道如何将表情符号粘贴到我正在撰写的 Facebook 广告中? PS 这也很有趣:apple.stackexchange.com/a/240450/53510
我刚刚意识到这个 &#xFE0E; 技巧不适用于某些字体。我很难找到一种我可以合理期望安装在所有机器(Windows、iOS、Mac、Android 等)上的字体。
对于甚至可能出现在输入字段中的符号,这种解决方案实际上是不可接受的。我在逻辑中使用的符号 ↔ 遇到了这个问题,我一生都无法理解为什么有人认为这应该是一个表情符号!
下一页有助于在表情符号之后立即复制和粘贴该特殊字符,使其看起来扁平而不是风格化。例如,您可能会看到 💬︎ 而不是 💬 和 🌟︎ 而不是 🌟 和 ⌛︎ 而不是 ⌛ 和 🔒︎ 而不是 🔒(取决于您的设备)unicode-symbol.com/u/FE0E.html
这在我的示例中呈现为表情符号,mac 10.11.6 上的 chrome 71。
t
t_l

我在 span::beforecontent 中有一个 Unicode 字符,并且我将 spanfont-family 设置为“Segoe UI Symbol”。但是 Chrome 使用“Segoe UI Emoji”作为字体来渲染它。

但是,当我将 font-family 设置为 span::before 的“Segoe UI 符号”显式时,而不仅仅是 span,它就起作用了。


这应该是正确的答案,尤其是因为大多数主流浏览器都不支持旧的不可见字符方法。
在 emoji 之后在 CSS 中附加 \FE0E 外观取决于之前使用的符号,这很奇怪。示例 \23EA 在 CSS 中不使用修饰符更改,但在简单 html 中更改。但是使用“Segoe UI Symbol”作为 CSS 中的第一个字体系列会有所帮助。
c
cmbuckley

对于阻止 iOS 显示表情符号的纯 CSS 解决方案,您可以使用 font-family: monospace,它默认为字形的文本变体而不是表情符号变体:

普通字符:↩

等宽字符:


对我来说,它是这个和 stackoverflow.com/a/38452396/8386844 的组合,适用于 Chrome 85
@Rohan'HEXcube'Villoth 为什么需要这个组合?当我使用等宽字体时效果很好。我没有安卓手机。也许这就是原因?
s
ssokolow

如果您主要关心的是强制单色显示以使表情符号不会从文本中脱颖而出,那么 CSS 过滤器(单独或与 Unicode 变体选择器结合使用)可能是您想要的。

p.gscale { -webkit-filter: 灰度(100%);过滤器:灰度(100%); } a { 颜色:#999; -webkit-filter:灰度(100%)棕褐色(100%)饱和(400%)色调旋转(170度);滤镜:灰度(100%)棕褐色(100%)饱和(400%)色调旋转(170度); }

你现在已经在 🔒lockdown🔒 上显示了表情符号。

外部链接:庆祝🎉

与变体选择器不同,表情符号的呈现方式无关紧要,因为 CSS 过滤器适用于所有内容。 (我使用它们对已修改为指向 Wayback Machine 的超链接上的 PNG 格式的“链接类型”图标进行灰度化。)

请注意警告。您不能在子元素中覆盖父元素的过滤器,因此该技术不能用于对段落进行灰度化,然后重新着色其中的链接。 😢

...不过,它对于您将整个事物设为超链接或不允许其中包含丰富标记的情况很有用。 (例如标题和描述)

但是,除非实际应用了 CSS,否则这将不起作用,因此我将提供第二个选项,它在 <title> 元素中比 Unicode 变体选择器更可靠(我在看你的 GitHub。我不喜欢假我的浏览器标签中的图标):

如果您将用户提供的字符串放入 <title> 元素中,请过滤掉表情符号以及任何粗体/斜体/下划线/等。标记。 (是的,对于那些错过它的人,该标准确实要求 <title> 的内容是纯文本,除了 & 符转义和我测试的浏览器将所有标签解释为文字文本。)

我能想到的两种方法是:

直接使用手动维护的正则表达式,它与最新版本的 Unicode 放置其表情符号及其修饰符的块相匹配。遍历字素簇并丢弃任何包含已识别的表情符号代码点的内容。 (字素簇是一个基本字形加上构成可见字符的所有变音符号和其他修饰符。我链接到的示例使用 Python 的正则表达式引擎进行标记,然后使用数据库的表情符号包,但 Rust 是一个很好的例子通过像 unicode-segmentation 这样的 crate 可以快速轻松地迭代字素簇的语言。)


f
feraleyebrows

其他解决方案都不适合我,但我最终找到了 css-tricks 提供的东西。在我的用例中,我在每个 Markdown 标题的末尾添加了一个链接符号,用于直接链接到文章中的部分,但表情符号看起来有点分散注意力。下面的代码让我可以让表情符号看起来像一个普通的符号,然后在悬停在上面时切换回看起来像一个表情符号,这非常适合我的用例。如果您只是想让图标看起来更像一个符号,只需将 text-shadow 十六进制颜色更改为 #000,如第二个示例所示。

.direct-link { 颜色:透明;文本阴影:0 0 #dbe2ec; } .direct-link:hover { 颜色:继承; }

博客副标题🔗

.direct-link { 颜色:透明;文字阴影:0 0 #000; }

博客副标题🔗


短语“没有其他”是模棱两可的。在您写这篇文章之前,我们不知道存在哪些答案。 (是的,我们可以查看日期,但是……)
这是一个很酷的想法,但请注意,许多表情符号周围都有框,例如箭头和播放/暂停等。使用这种技术,这些键帽/按钮样式的表情符号将变得难以辨认。而且它总是取决于字体,所以你必须考虑不同的平台。
D
Daniil Iaitskov

Android 字体并不像你想象的那样丰富。字体文件没有这些奇异的字形,Android 对没有字形的少数字符进行了破解。它们被图标替换。

所以解决方案是将网站与网络字体(woff)集成。例如,使用 FontForge 创建新字体文件并从免费衬线 TTF 中选择所需的字形。每个字形需要 1k。生成 woff 文件。

准备简单的 CSS 以导入自定义字体系列。

样式.css:

@font-face {
  font-family: 'Exotic Icons';
  src: url('exotic-icons.woff') format('woff');
}

.exotic-symbol-font {
    position: relative;
    top: 1px;
    display: inline-block;
    font-family: 'Exotic Icons';
    font-style: normal;
    font-weight: normal;
    line-height: 1;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

index.html 文件:

<html>
  <head>
    <meta charset="utf-8">
    <link href="style.css" rel="stylesheet"></head>
    <title>Test custom glyphs</title>
  </head>
  <body>
    <table>
      <tr>
        <td class="exotic-symbol-font">
            😭 ☠ &#x2660; a  g
        </td>       
      </tr>
    </table>
  </body>
</html>

C
Clay Allen

Google Chrome 桌面版 75 似乎根据加载页面时遇到的第一个 Unicode 转义来消除其呈现 Unicode 字符的方法。例如,当被解析为页面源中的第一个 HTML Unicode 转义,并且没有等效的表情符号时,⏷似乎向 Chrome 澄清该页面包含不被呈现为表情符号的转义。


I
IS4

ssokolow's answer 的基础上扩展,使用过滤器很好,至少可以使轮廓可见,而不是使用简单的字体,但是当您想要使用特定颜色时,将 RGB 颜色转换为一系列 CSS 过滤器非常困难。

一个更好的(虽然很冗长)选项是使用 <feColorMatrix> SVG 过滤器。结合灰度过滤器和数据 URI 方案,您可以通过 RGB 和内联 CSS 来表示颜色:

.violet {
  color: white;
  filter: grayscale(100%) url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='0.78 0 0 0 0  0 0.082 0 0 0  0 0 0.522 0 0  0 0 0 1 0'/></filter></svg>#f");
}

不幸的是,您不能使用数据(取自属性或变量)对 URL 进行插值,但至少您不必根据 RGB 计算 CSS 过滤器。


S
Slbox

如果其他答案都不适合您,则您的字体堆栈中可能有一种或多种这些字体(就像我们的情况一样):

Segoe UI 表情符号

苹果色表情符号

这些包含在许多常用字体堆栈中,如果我没记错的话,比如 Github 字体堆栈。


M
Michael Jaros

我的问题的具体版本

我的网站在 CSS 伪元素::after::before)中使用 ◀︎(黑色右指向三角形)和类似字符来指示列表中的当前项目。

在我的测试中,我总是使用 the triangle character and the variation selector 15 together。首先,我同时使用了来自 Google Fontswebfont安装在设备上的字体,它们都应该包含这些字符的字形,但出于某种原因,这个假设一定是错的。我还在 Google Fonts 上尝试了不同的子集,但无济于事:我的两台带有 Google Chrome 和 Samsung Internet (Chromium) 的 android 设备总是呈现表情符号而不是文本字形。

我的解决方案

我的解决方案是下载 Gnu Free Font 的最新 WOFF(我知道其中包含这些字符的字形),将其包含在我的项目中,并使用 @font-face 定义它:

@font-face {
  font-family: "Free Sans";
  src: url("/site/static/fonts/FreeFont/FreeSans.woff") format("woff");
}

然后,为我的伪元素设置样式:

span.current::after {
  font-family: "Free Sans", $universal-font-family ! important;
}

讨论

我还不确定仅对这几个字符使用 786K 额外字体对性能的影响。如果这成为问题,则应该可以使用仅包含这些字符的精简自定义字体。


D
Davide Pastore

我不知道关闭表情符号类型渲染的方法。通常我使用图标字体,例如 font awesomeglyphicons(Bootstrap 3 附带)。

使用这些而不是 unicode 字符的好处是

您可以从许多不同的样式中进行选择,使其适合您的网站设计;它们在浏览器中是一致的(如果你曾经尝试过使用 unicode 星号,你会发现它在 IE 和其他浏览器中是不同的);此外,它们是完全可样式化的,就像您尝试使用的 unicode 字符一样。

唯一的缺点是浏览器在查看您的页面时要下载另一件事。


N
Nathan

对于我在 OSX 上的解决方案是将 font-family 设置为 EmojiSymbols


r
rubo77

上述解决方案均不适用于“谷歌 Chrome 表情符号”扩展程序。

因此,作为一种解决方法,我制作了 Unicode 字符 'BALLOT BOX WITH CHECK' (U+2611) 的屏幕截图,并使用 php 将其添加为图像:

 $ballotBoxWithCheck='<img src="pics/U2611.png" style="height:11px;margin-bottom:-1px">'; # &#9745; or /U2611

https://i.stack.imgur.com/PBFg2.png

请参阅:https://spacetrace.org/man_card.php?tec_id=21&techname=multi-emp-vessel


几乎可以肯定,最好使用文本工具将其粘贴到 Inkscape 中(使用选择了合适许可证的字体),然后运行自动跟踪,这样您就可以从中获得一个 SVG,它可以缩放到您需要的任何大小。 (为了使其尽可能小,将 SVG 缩小器与一些手动编辑配对,以减少自动跟踪出错的路径中的节点数量。)