使用JavaScript设置charset元标记

时间:2012-09-24 06:41:29

标签: javascript html utf-8 character-encoding epiceditor

我正试图在此处追踪错误: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 ...

3 个答案:

答案 0 :(得分:18)

您无法通过设置charset属性来设置charset内容属性,因为它们不会相互反映。实际上,没有反映charset内容属性的属性。

http-equiv内容属性由httpEquiv属性反映,所以

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

会正确创建元素。

但这些都不重要。字符集由解析器建立,因此在解析HTML之后在JavaScript中构造元元素根本不会影响文档的字符集。

答案 1 :(得分:0)

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

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

作为一个侧节点,请不要忘记根据HTML5规范,字符集元标记应该的开头。见this answer。这个简单的细节导致了我的应用程序中的一个重要错误:)

你应该使用:

document.head.insertBefore(charsetMetaTag,document.head.firstChild);

答案 2 :(得分:0)

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

但是只要解决就可以解决您的原始问题

<meta>

使用setAttribute方法

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

并按照@ sebastien-lorber的建议,将输出

<meta charset="UTF-8">

作为head的第一个子元素