Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отобразить страницу с одной кодировкой на странице с другой кодировкой (https://javascript.ru/forum/misc/63374-otobrazit-stranicu-s-odnojj-kodirovkojj-na-stranice-s-drugojj-kodirovkojj.html)

MrBean 03.06.2016 15:33

Отобразить страницу с одной кодировкой на странице с другой кодировкой
 
Есть страница в кодировке utf-8. В теле страницы есть строка, содержащая страницу в другой заведомо неизвестной кодировке. Нужно как-то отобразить эту строку на странице. Пытался вставить эту строку в iframe, но он отображает строку в кодировке родительской страницы. При этом известно, если в iframe скормить страницу в неизвестной кодировке через src, проблем нет. Пример кода:
<!doctype html><html>
<head><meta charset="utf-8"></head>
<body>

	<p>Строка в кодировке utf-8.</p>
	<iframe width="600" height="300"></iframe>
	<script>

		var unknown_charset_page  = '<!doctype html><html><head><meta charset="windows-1251"></head><body><p>??? ??????windows-1251.</p></body></html>';

		document.querySelector('iframe').contentWindow.document.write(unknown_charset_page);

	</script>

</body>
</html>

laimas 03.06.2016 16:27

Цитата:

Сообщение от MrBean
В теле страницы есть строка, содержащая страницу в другой заведомо неизвестной кодировке.

Что такая проблема узнать кодировку и конвертировать ее в ту, с которой работает сайт?

MrBean 03.06.2016 16:57

Это абстрактная задача, хотелось бы найти решение именно в рамках этих условий.

laimas 03.06.2016 17:02

А при чем тут абстракция? Или же вместо того чтобы определить кодировку текста выгоднее граблями оперировать?

MrBean 03.06.2016 17:18

Нужен способ именно отобразить строку в документ с другой кодировкой без конвертаций.

laimas 03.06.2016 17:33

Цитата:

Сообщение от MrBean
ужен способ именно отобразить строку в документ с другой кодировкой

И как по вашему должен опознать такого "ерша" браузер, да и не обязательно он, любая программа отображающая текст? Что теги расставлять что вот тут utf, а с символа 261 начинает 1251?

В один поток нельзя.

PS. А вот в iframe, как другой документ, работать будет.

MrBean 03.06.2016 17:50

Может есть способ как-то обмануть браузер с чувством другого документа в iframe?

laimas 03.06.2016 18:49

А в фрейме и без обмана будет документ отображен в той кодировке, в которой указано.

MrBean 03.06.2016 19:12

Имелось ввиду, может есть способ динамически сформировать содержимое iframe и заставить браузер при этом думать, что в iframe другой документ, чтобы он отобразил его в оригинальной кодировке без кракозябр.

Deff 03.06.2016 22:38

Цитата:

Сообщение от MrBean
Нужен способ именно отобразить строку в документ с другой кодировкой без конвертаций.

Можно вставить собранный кусок нужного HTML в типовой документ в пустой фрейм, в хидере прописать нужную кодировку
<iframe name="IFRAME" width=100% height=300></iframe>

IFRAME.document.write(html)

MrBean 04.06.2016 07:53

Если содержимое iframe формировать через document.write, браузер почему-то отображает содержимое в кодировке родительского для iframe документа. Писал об этом в первом посте.

Deff 04.06.2016 08:12

Цитата:

Сообщение от MrBean
Если содержимое iframe формировать через document.write, браузер почему-то отображает содержимое в кодировке родительского для iframe документа. Писал об этом в первом посте.

Вы заголовок вписываете и с требуемой кодировкой во фрейм ? (Или ток body втыкаете ?
Например:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
И.т.д. ...

2. Есть возможность через XMLHttpRequest получать документ в желаемой кодировке, поищите где нидь тут https://developer.mozilla.org/ru/docs/XMLHttpRequest

3.Вы во фрейме втыкаете в контент, а нужно через write вписывать полный контекст документа(вместе шапкой и хидером) перезаписывать в пустой фрейм, я показал как ранее(используя имя фрейма)
4. Есть уверенность что символы уже не обрезаны при получении контента ? ( Т.е. символы кракозябров имеют не один и тот же код ? попробуйте просмотреть коды нескольких символов подряд
5. Код заголовка шапки и хидера вставляемый во фрейм должен быть тоже закодирован и вставляем в той же кодировке, что и контент, сохранить в тектовый документ в нужной(желаемой) кодировке, скопировать и вставить на страницу (или в блокнот) с utf-8 - cкопировать и вставить в скрипт переменную. Геммор ещё тот, проще взять кодер-декодер utf-8 в windows-1251

(Где то тут на форуме решал подобную задачу, отправку поискового запроса Аяксом трансформируя текст (прописанного яваскрипт переменной), т.е.UTF-8 в windows-1251

MrBean 04.06.2016 10:08

1. Вот пример вставляемого кода из первого поста:
<!doctype html>
<html>
	<head>
		<meta charset="windows-1251">
	</head>
	<body>
		<p>Строка в кодировке windows-1251.</p>
	</body>
</html>
Здесь есть и doctype, и head, и meta charset, и body. К слову, код в формате XHTML вставлять тоже пробовал - разницы никакой.

2. С получением кода в другой кодировке проблем нет.

3. Тестовый код идентичен тому, что вы показывали. Смотрим первый пост.

4. Такая уверенность есть. Проверялось переключением кодировки в браузере. То есть если переключить кодировку в браузере на кодировку вставляемой строки, кракозябры пропадают.

5. Чтобы кодировки не слетели от копирования, тестовый пример генерирую php-скриптом. То есть этот подвох учитывается.

laimas 04.06.2016 12:54

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body>
<p>Это родительская страница в UTF, с сайтом в кодировке CP1251 загруженным во фрейм</p> 
<iframe src="http://winrus.com/cpage_r.htm" width="600" height="400"></iframe>
</body> 
</html>


И как, проблемы есть?

MrBean 04.06.2016 13:57

laimas, проблемы есть, речь идет о динамическом формировании содержимого iframe, которое почему-то не работает также как в вашем примере.

laimas 04.06.2016 15:16

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script> 
$(function() {
    $('<iframe/>').appendTo('body').css({width : 600, height : 400}).attr('src', 'http://winrus.com/cpage_r.htm')
});
</script>     
</head> 

<body>
<p>Вы лучше поясните чем вы занимаетесь, ибо суть поста "неизвестная кодировка", а документу фрейма кодировку то нужно указывать. Так ли она неизвестна тогда?</p>
<p>Динамическое добавление фрейма не определяет кодировку его документа, кодировка определяется в документе загруженном в него.</p>
</body> 
</html>

MrBean 04.06.2016 16:02

Есть же конкретная задача, содержимое iframe нужно сформировать из строки. О том, что через src работает, я писал сразу. Похоже, тема совсем безнадежная, столько ответов и даже с условиями задачи толком не разобрались.

laimas 04.06.2016 16:08

Еще раз - кодировку документа в iframe вы должны указать (это сделать можно, как и записать в бланк изначально загруженный что угодно). Если вы должны, то кодировка этой строки должна быть вам известна. Вы же пишите, что она не известна. И если это всего лишь строка, то не понятно чего вы до сих пор паритесь, не конвертируя ее в кодировку с которой работает страница, а паритесь с фреймом.

MrBean 04.06.2016 16:29

Как указать кодировку iframe, если meta charset игнорируется браузером во вставляемой строке? О заведомо неизвестной кодировке пишется для того, чтобы решение не было привязано к этой кодировке, это не значит, что она не указана в теле вставляемой строки. Смотрим мой пример кода.

laimas 04.06.2016 16:51

Цитата:

Сообщение от MrBean
Как указать кодировку iframe, если meta charset игнорируется браузером во вставляемой строке?

С чего это вдруг?

Значит пусть сервер отдает страницу, и либо в мета, либо заголовками вы определяете ее кодировку и пусть это будет UTF. Значит и скрипт этот должен сохраняться в UTF.

Пусть на этой же странице есть некий js-сценарий, в котором вы пытаетесь записать в создаваемый iframe (что в общем то не важно, он может уже и быть на странице) слово "тест". В какой кодировке будет это слово? Также в UTF, так как оно отдано одним потоком скриптом в utf и объявленной utf кодировкой.

То есть, нечто иной кодировки как переменная должно получаться отдельным запросом. И пусть это у вас выполняется. Тогда:

$(создаем и помещаем на страницу iframe, указав в качестве src "about:blank").load(function() {
    //вот так можно получить head фрейма
    $(this.contentWindow.document.head) //чисто на jQ, это .content() 
    //в котором можно объявить кодировку вставив метатег charset
    //соответственно тело документа
    $(this.contentWindow.document.body)
    //куда можете записывать свои строки или что угодно
})

laimas 04.06.2016 17:15

<?
if($_POST) {
    header('Content-type: text/html; charset=windows-1251');
    exit(iconv('utf-8', 'windows-1251', 'Текст в CP1251'));
}
?> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>

</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script> 
$(function() {
    $('<iframe/>').appendTo('body').css({width : 600, height : 400}).attr('src', 'about:blank').load(function() {
        var doc = this.contentWindow.document;
        $(doc.head).append('<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />')
        $.post(location, {a:1}, function(d) {
            $(doc.body).append('<p>'+d+'</p>')
        })    
    })
});
</script>     
</head> 
<body>
</body> 
</html>


Поместите на свой локальный сервер под любым именем, но сохранив обязательно в utf-8. Локальный сервер также должен либо в этой кодировке по умолчанию работать, либо не должен передавать заголовка кодировки.

Запустите - iframe будет отображать строку в 1251, которую ему отдаст сервер, предварив вывод передачей соответствующего заголовка. И как можете убедиться проблем нет.

MrBean 04.06.2016 17:48

Вашу идею кажется понял, надо попробовать прикрутить ее к изначальной задаче.

MrBean 04.06.2016 18:20

---

laimas 04.06.2016 20:40

Цитата:

Сообщение от MrBean
идею кажется понял, надо попробовать прикрутить ее к изначальной задаче

Да какая к черту идея, грабли это. Прикручивайте, вот только не понять зачем это нужно - берется со своего сервера, а значит хоть есть фрейм уже, хоть динамический, src->путь к скрипту отдающему что-то там с кодировкой.

pureJS 11.06.2016 22:37

Цитата:

Сообщение от MrBean (Сообщение 418423)
Нужен способ именно отобразить строку в документ с другой кодировкой без конвертаций.

Цитата:

Сообщение от MrBean (Сообщение 418439)
Имелось ввиду, может есть способ динамически сформировать содержимое iframe и заставить браузер при этом думать, что в iframe другой документ, чтобы он отобразил его в оригинальной кодировке без кракозябр.


MrBean, вот эти два твоих сообщения противоречат друг другу. Сначала ты хочешь:
с другой кодировкой без конвертаций
а затем:
в оригинальной кодировке без кракозябр

Если твоя строка в левой кодировке, то как можно ОДНОВРЕМЕННО обойтись "без конвертаций" и без "без кракозябр"? Или ты думаешь, что обозреватели сети ничего не определяют и не изменяют при отображении? Кто же по твоему это делает?

Такое сделать НЕЛЬЗЯ как ты хочешь! Кодировка должна быть известна ОБОЗРЕВАТЕЛЮ СЕТИ при загрузке, либо она должна быть определена после неё. Если второе, то после этого обязательно нужно перевести строку из опознанной кодировки в Unicode (все строки после загрузки отображаются в JavaScript в Unicode) и только потом уже вставляются туда, куда там тебе надо.

Именно поэтому у тебя не выходит и никогда не выйдет без преобразования в Unicode записать в IFRAME то, что ты хочешь.

Также ты слукавил (или по незнанию) и написал, что:
Цитата:

Сообщение от MrBean (Сообщение 418413)
В теле страницы есть строка, содержащая страницу в другой заведомо неизвестной кодировке.
...........
var unknown_charset_page = '<!doctype html><html>.........';


В этом случае эта строка ВСЕГДА будет грузиться исходя ИЗ той кодировки, в которой стоит charset документа. Однако мы можем получить такую строку в неверной кодировке, если получим её через неверно загруженный JavaScript или через AJAX.

Вот пример:
<!doctype html>
<html><head>
<meta charset="utf-8">
<style type="text/css">
</style>
<script type="text/javascript" src="string_in_win-1251.js" charset="windows-1251"></script>
<script type="text/javascript">
function showResult()
{
	var showcode=document.getElementById('result').contentDocument.open();
	showcode.write(string_in_win1251);
	showcode.close();
}
</script>
</head><body>
<iframe id="result" frameborder="0" style="border:1px solid gray" src="about:blank"></iframe>
<input type="button" value="Выполнить" onclick="showResult()">
</body></html>

Обрати внимание на то, что если убрать из загружаемого "string_in_win-1251.js" указание charset, то строка string_in_win1251 загрузится неверно и в этом случае нам не обойтись без преобразования в Unicode перед выводом, т.к. вывод будет в таком случае неверным.

Также обрати внимание на то, что в данном случае уже совершенно неважно какую кодировку мы укажем при записи в IFRAME, ибо в это время обозревателю сети это уже не важно - документ загружен.

Содержимое файла "string_in_win-1251.js", который сохранён в windows-1251:
var string_in_win1251 = '<b>Такое сделать НЕЛЬЗЯ как ты хочешь!</b>';

Также про кодировки можно почитать:
https://learn.javascript.ru/string
https://learn.javascript.ru/es-string


Часовой пояс GMT +3, время: 09:17.