16

我试图在这里追踪一个错误:https ://github.com/OscarGodson/EpicEditor/issues/184#issuecomment-8805982

根据所有信息,这似乎是因为浏览器默认为用户的本机字符集(在本例中为ISO-8859-1),而UTF-8不像我的机器和美国的其他机器上那样。我猜一个解决方法是使用 HTML 来强制编码UTF-8

 <meta charset='utf-8'> 

或者

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

但是,JS 不工作。在第一个示例中:

charsetMetaTag = self.editorIframeDocument.createElement('meta');
charsetMetaTag.charset = 'utf-8';
self.editorIframeDocument.getElementsByTagName('head')[0].appendChild(charsetMetaTag);

我刚刚返回注入 DOM 的以下内容:

<meta>

在第二个示例中,http-equiv未设置:

charsetMetaTag = self.editorIframeDocument.createElement('meta');
charsetMetaTag['http-equiv'] = 'Content-Type';
charsetMetaTag['content'] = 'text/html; charset=utf-8';
self.editorIframeDocument.getElementsByTagName('head')[0].appendChild(charsetMetaTag);

我得到以下 HTML:

<meta content="text/html; charset=utf-8">

是的,我需要动态地执行此操作,因为我动态地创建 iframe。这甚至可能不是问题,但这就是它的样子。我能想到的唯一“黑客”是以某种方式使用innerHTML ...

4

3 回答 3

20

您不能通过设置 charset 属性来设置 charset 内容属性,因为它们不会相互反映。事实上,没有任何属性可以反映 charset 内容属性。

http-equiv 内容属性由 httpEquiv 属性反映,因此

 charsetMetaTag['httpEquiv'] = 'Content-Type';

将正确创建元元素。

但这都不重要。字符集是由解析器建立的,所以在解析完 HTML 之后在 JavaScript 中构造 meta 元素对文档的字符集完全没有影响。

于 2012-09-24T07:00:35.383 回答
0

正如 Alohci 所说,从 JS 创建与字符集相关的元标记不会对当前页面产生太大影响。

在我的用例中,我需要能够将当前页面序列化为字符串并将其保存到某个后端。附加缺少的字符集元标记(如果不存在)对于这样的用例很有用。

作为一个侧节点,不要忘记字符集元标记应该在HTML5 规范的开头。看到这个答案。这个简单的细节导致了我的应用程序中的一个重要错误:)

你应该使用:

document.head.insertBefore(charsetMetaTag,document.head.firstChild);
于 2017-03-17T16:48:56.520 回答
0

我同意@alohci 和@sebastien-lorber 的回答。

但只是解决你的原始问题只是得到

<meta>

使用 setAttribute 方法

charsetMetaTag.setAttribute("charset", "UTF-8");

并遵循@sebastien-lorber 的建议,将输出

<meta charset="UTF-8">

作为头部的第一个子元素

于 2020-12-03T23:29:57.253 回答