Подтвердить что ты не робот

Установите метатег набора символов с помощью 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...

4b9b3361

Ответ 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);