我正试图在此处追踪错误: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 ...
答案 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的第一个子元素