Установите метатег набора символов с помощью JavaScript
Там ошибка, которую я пытаюсь найти здесь: 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">
Да, мне нужно сделать это динамически, поскольку я динамически создаю iframes. Возможно, это даже не проблема, но это то, на что это похоже. Единственный "хак", о котором я могу думать, как-то использует innerHTML...
Ответы
Ответ 1
Вы не можете установить атрибут содержимого кодировки, установив свойство charset, потому что они не отражают друг друга. На самом деле нет свойства, которое отражает атрибут содержимого charset.
Атрибут content http-equiv отражается в свойстве httpEquiv, поэтому
charsetMetaTag['httpEquiv'] = 'Content-Type';
будет корректно создавать мета-элемент.
Но ничего из этого не имеет. Набор символов устанавливается синтаксическим анализатором, поэтому построение мета-элемента в JavaScript после того, как HTML был проанализирован, вообще не повлияет на набор символов документа.
Ответ 2
Как сказал Алоччи, создание мета-тегов, связанных с наборами символов из JS, не будет иметь большого влияния на текущую страницу.
В моем случае я должен иметь возможность сериализовать текущую страницу в виде строки и сохранить ее на каком-то бэкэнд. Добавление метатега отсутствующего набора символов (если нет) полезно для такого использования.
Как side- node, не забывайте, что метатеги charset должны быть в начале в соответствии с спецификацией HTML5. См. этот ответ. Эта простая деталь привела к важной ошибке в моем приложении:)
Вы должны использовать:
document.head.insertBefore(charsetMetaTag,document.head.firstChild);