在javascript中检测浏览器字符支持?

IT技术 javascript jquery html ruby-on-rails character-encoding
2021-03-16 10:46:09

我正在一个音乐相关的网站上工作,并且经常使用 HTML 特殊字符来表示升号 (♯) 和降号 (♭) 来保持美观,例如:

♯
♭

但是,我注意到在某些浏览器(IE6、PC 版 Safari)中不支持这些字符。我创建了一个条件 javascript,它提供普通的、受支持的字符代替特殊字符( G# 代表 G♯ 和 Bb 代表 B♭ )。但是我很难弄清楚如何检测哪些浏览器缺少这些字符。

我知道我可以测试浏览器(例如 ie6),但我希望做正确的事情并测试字符支持本身。

有谁知道使用 javascript、jQuery 或 rails 来做到这一点的好方法吗?(该页面由 Rails 应用程序提供服务,因此请求对象和任何其他 Rails 魔法都在桌面上。

4个回答

如果您创建两个 SPAN,一个包含您想要的字符,另一个包含不可打印的字符 U+FFFD ( ) 是一个很好的,那么您可以测试它们是否具有相同的宽度。

<div style="visibility:hidden">
  <span id="char-to-check">&#9839;</span>
  <span id="not-renderable">&#xfffd;</span>
</div>
<script>
  alert(document.getElementById('char-to-check').offsetWidth ===
        document.getElementById('not-renderable').offsetWidth
        ? 'not supported' : 'supported');
</script>

您应该确保 DIV 没有使用固定字体设置样式。

这种方法的问题在于 � 显示的宽度和其他有效字符的宽度相同,例如 █
2021-04-22 10:46:09
我之前曾尝试在一次性 div 上添加特殊字符作为一个类,然后对该类进行测试,但没有任何运气。这是一段非常优雅的代码——谢谢!
2021-05-01 10:46:09
非常聪明!如此之快,我不得不再等四分钟才能将您的答案标记为已接受,我会的。
2021-05-03 10:46:09
此方法基于隐式假设,即字体中缺失的字符呈现为与 U+FFFD 相同。这是不可靠的,并且已知浏览器使用其他渲染。
2021-05-04 10:46:09
@Piripli,谢谢。在将其标记为接受之前,我会确保它确实适用于您担心的浏览器。马特鲍尔可能是对的。
2021-05-14 10:46:09

“浏览器支持”不是这里的问题。您应该将文件作为UTF-8 * 提供,并使用适当的字符而不是 HTML 实体。

  • Unicode 尖锐符号:♯ (U+266F)
  • Unicode 平面符号:♭ (U+266D)

您还应该确保以UTF-8(而不是 ASCII 或 ISO-8859-1)保存您的文件

另请参阅:必须提及的Joel 关于软件:每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!)


*我不是 Rails 专家,但我认为它默认是这样做的。

@Pirripli:请参阅此答案这可能只是字体问题,但将符号插入标记绝对是要走的路。您确定将文件保存为 UTF-8 格式吗?
2021-04-20 10:46:09
非常有趣,绝对值得一读,但我无法将本页的见解转换为清晰的符号......我首先尝试将相关 div 的类更改为使用 Arial,然后只是简单的 sans-serif,但没有成功。我很可能在这里遗漏了一些东西,但就目前而言,我想我将使用 Mike Samuel 的建议。如果我稍后成功,我会告诉你,但在这一点上,我认为仍然使用 ie6 的用户类型不会介意看到 # 代表♯。;)
2021-04-25 10:46:09
嗯...我相信我已经在这样做了。我有一个元标记:<meta charset="utf-8">。除了将实际符号复制并粘贴到我的标记中之外,我还应该做些什么特别的事情吗?我刚刚做了这个,在 ie6 上测试了它,发现了小方块。你知道ie6支持这两个符号吗?
2021-04-29 10:46:09
@Pirripli:很高兴您了解 JS 方法更像是一种 hack。IMO,最好的解决方案是简单地停止 支持 IE6也就是说 - 你确实提到 Windows 上的 Safari 也有问题......
2021-05-06 10:46:09
哈!我喜欢 ie6nomore.com,并且会考虑使用他们的代码来提示用户朝着正确的方向前进。然而,我已经注意到,即使我每天都在与 ie6 搏斗(这是我在任何设计项目中最不喜欢的部分),我发现尝试让事情为 ie6 工作通常会让我编写更好的代码,依赖更简单的 HTML,更少的框模型黑客(例如负边距等...),让我更全面地思考页面,而不仅仅是 DIV 和 CSS 的集合。不要误会我的意思,我仍然讨厌它。但我认为它更像是一个混蛋田径教练。
2021-05-09 10:46:09

你应该做的是使用 css 的unicode-range

@font-face {
  font-family: 'MyWebFont'; /* Define the custom font name */
  src:  local("Segoe UI Symbol"),
        local("Symbola"),
        url('myfont.woff2') format('woff2'),
        url('myfont.woff') format('woff'); /* Define where the font can be downloaded */
  unicode-range: U+266F, U+266D; /* Define the available characters */
}

body {
  font-family: 'MyWebFont', Arial;
}
&#9839;
&#9837;
Normal text

local块中,定义人们可能在本地安装的字体并包含您想要的符号(如 Window 的 Segoe UI 符号)。然后定义一个包含要显示的符号的网络字体(我建议使用Symbola)。

unicode-range 指令告诉支持的浏览器(IE9 及更高版本)不要下载字体,除非页面上存在指定的符号(您可以通过搜索Unicode-Tables找到它们的 unicode 编号。)

如果他们已经有了字体,他们就不会下载。如果该符号不存在于页面上并且您的浏览器不早于污垢,则不会下载该字体。它只会在需要时下载。

(如果你仍然想支持旧的 IE,使用fontsquirrel生成你的初始 @font-face 语句,然后自己添加localunicode-range部分。

将此添加到您的 HTML

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 

</head>

并检查 IE 和 Safari 是否正确呈现页面。

不,没有运气。我已经有了 <meta charset="utf-8">,但我尝试添加您的属性无济于事……不过,感谢您的想法!我希望是这样...;)
2021-04-25 10:46:09