Динамически загружать кодировку UTF-8 и ISO-8859-1 из Javascript

Я попробовал кодировку UTF-8 для отображения ä, она отображала какой-то квадрат.

Также я попытался с кодировкой ISO-8859-1 отобразить ä, она отобразилась как ä. (что правильно)

Но когда вы объединяете обе вышеперечисленные кодировки в условии javascript, это не работает должным образом. См. ниже код,

 <html>
    <head>
        <script type="text/javascript">
            var lang = 'German';
            function f(){           
                if(lang != 'SomeOtherLanguage'){
                   //here code will execute. And page should display square box. Instead of square box, ä is displayed. Which is wrong. I cant able to find reason.
                    metaTag = '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>';                
                }
                else
                    metaTag = '<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>';                   

                document.getElementsByTagName('head')[0].innerHTML += metaTag;
            }           
        </script>
    </head>
    <body onload="f()">
        <h1>Latin letter :  ä </h1> <br />  
    </body>
</html>

person pts    schedule 07.10.2015    source источник
comment
Совет: всегда используйте utf-8 и вместо ä используйте эквивалент объекта: &auml;. Здесь больше символов: dev.w3.org/html5/html-author/charref   -  person ojovirtual    schedule 07.10.2015
comment
@ojovirtual Если вы правильно используете UTF-8, то зачем использовать объект HTML ?! Это чертовски бессмысленно.   -  person deceze♦    schedule 07.10.2015
comment
Это похоже на обратное решение: когда ваш JavaScript запускается, HTML уже интерпретируется. Почему бы вам просто не использовать всегда UTF-8 и не следить за тем, чтобы сервер правильно отправлял данные?   -  person Joachim Sauer    schedule 07.10.2015
comment
И страница должна отображать квадратную рамку. Вместо квадратного прямоугольника отображается ä. Что неправильно. – Что?! Почему квадратное поле было бы правильным?   -  person deceze♦    schedule 07.10.2015


Ответы (2)


Вы не можете, набор символов устанавливается синтаксическим анализатором, который должен анализировать Javascript, чтобы сгенерировать этот мета-DOM.

Вы по-прежнему можете использовать только один набор символов и преобразовывать данные.

person lilezek    schedule 07.10.2015

То, что вы пытаетесь сделать, никогда не сработает.

Если необработанные байты вашего HTML не закодированы как UTF-8 для начала, вы не можете требовать UTF-8 в теге <meta> или заголовке HTTP Content-Type. Вы будете лгать браузеру/клиенту, и именно поэтому вы получите плохие результаты.

Ваш код будет «работать» только тогда, когда ваш тег <meta> утверждает ISO-8859-1 (и нет заголовка Content-Type, чтобы переопределить это), если ваш HTML на самом деле закодирован в ISO-8859-1. В некоторых (но не во всех) наборах символов ISO-8859-X, включая ISO-8859-1, ä кодируется как байт 0xE4, поэтому ваш код "работает" при утверждении ISO-8859-1, если байт 0x34 присутствует в кодировке. Необработанные данные HTML.

В UTF-8 вместо этого ä кодируется как байты 0xC3 0xA4. Если ваш HTML содержит байт 0xE4, но вы заявляете UTF-8, вы получите неверный результат (0xE4 не является допустимым байтом в UTF-8).

Таким образом, ваш тег <meta> (и заголовок HTTP Content-Type) должен требовать кодировки, которая фактически соответствует реальной кодировке необработанных байтов HTML.

Если ваш HTTP-сервер обслуживает статический HTML-файл, этот файл кодируется в определенной кодировке при сохранении HTML-файла. Этот же набор символов должен быть указан статически в теге <meta> (и желательно также в заголовке HTTP Content-Type). Если ваш HTTP-сервер динамически генерирует HTML, ему необходимо закодировать HTML в определенной кодировке для передачи, поэтому ему необходимо указать ту же кодировку в сгенерированном теге <meta> (и заголовке Content-Type).

Другими словами, перестаньте пытаться лгать браузеру/клиенту. Скажите правду, тогда вы больше не столкнетесь с этой проблемой.

person Remy Lebeau    schedule 07.10.2015