Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Rfr bpvtybnm document.defaultCharset ? (https://javascript.ru/forum/events/54219-rfr-bpvtybnm-document-defaultcharset.html)

Arcoslov 09.03.2015 16:10

Rfr bpvtybnm document.defaultCharset ?
 
Всем привет!
Помогите, пожалуйста, разобратсья!

alert(document.defaultCharset); выдаёт windows-1252.
Почему он показывает 1252 и как установить utf8?

Когда я передаю жаваскриптом данные методом $.post с одной страницы на другую, то другая страница славливает их как 1252 (т.е. кракозябры приходят), хотя обе страницы в utf8, а htaccess прописано AddDefaultCharset UTF-8 и в head прописано <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Гугл говорит, что document.defaultCharset это неизменяемый параметр, но никак не могу понять его суть, что он отображает и откуда он это берёт и как это изменить

:help:

laimas 09.03.2015 16:25

Вы не то проверяете - defaultCharset у каждого браузера и ОС будет различен, это набор символов по умолчанию. Например в IE d Windows русской локализации defaultCharset будет равно windows 1251. А кодировка документа переданная заголовком (htaccess прописано AddDefaultCharset UTF-8 - сервер определяет, метатег можно собственно и опустить) или meta, это document.charset - что это у вас показывает?

Arcoslov 09.03.2015 16:37

document.charset показывает utf8.

laimas 09.03.2015 16:39

Вот это и есть кодировка документа. Отображение верное в документе?

Arcoslov 09.03.2015 16:46

Конструкция следующая.
есть файл php, в котором форма с инпутами. По нажатию на кнопку, данные сабмитятся в другой файл php, в котором описаны функции работы с бд, чтобы записывать данные с формы в бд.

Непосредственно перед сабмитом, данные, введённые в форму, в первом файле отображаются нормально, если их вывести, например, алертом. Если же во втором файле первой строчкой сделать print_r($_REQUEST), то видно, что приходят кракозябры.

В первом файле конструкция отправки такая:
...
		$.post( '".$site."operations.php?page=order',form,
		function(answer,post_status)
		{
			if(post_status!='success')
				alert('Ошибка. Операция не выполнена.');
			else
				if(answer)
					send_goods(answer);
		});

Arcoslov 09.03.2015 16:48

p.s. у меня на трёх разных компах с разными ОСями везде показывает alert(document.defaultCharset); выдаёт windows-1252, даже в ie.
Может, это всё-таки какой-то серверный параметр?

laimas 09.03.2015 16:52

Вы путаете все - данные с клиента серверу будут переданы в той кодировке, в которой у вас работает страница (пусть у вас это через метатег определено, и как показываела проверка, это UTF8), alert(возвращенного $_REQUEST, хотя нафиг он вам нужен, если вас интересует только print_r($POST, true)), будет отображать в той кодировке, в которой вернул их серверный скрипт обрабатывающий запрос $.post.

laimas 09.03.2015 16:58

Может, это всё-таки какой-то серверный параметр?

Нет такого параметра у севера, сервер не заведует документом на клиенте, он его отдает ему. Нашел специально, причем отличный источник, хотя на нынешнее время и старый Дени Гудман, Майкл Морисон "JavaScript Библия пользователя", что это означает. Проблему ищите на сервере, добавьте перед отправкой возвращаемых клиенту данных заголовок с указанием кодировки и проверьте после этого (страницу по ссылке только прокрутить чуток надо, чтобы все прочесть и почесать темечко).

danik.js 09.03.2015 17:45

Жмешь F12, смотришь вкладку сеть, ищешь там в Resonse Headers заголовок Content-Type, смотришь какой в нем charset. Если не utf-8 - значит не настроил apache (.htaccess) или перезатер через header() в php.

Arcoslov 09.03.2015 18:02

Цитата:

Сообщение от danik.js
Жмешь F12, смотришь вкладку сеть, ищешь там в Resonse Headers заголовок Content-Type, смотришь какой в нем charset. Если не utf-8 - значит не настроил apache (.htaccess) или перезатер через header() в php.

Resonse Headers словил как charset=iso-8859-1, она же windows-1252.
о_О
в php у меня нигде headers функции нету. проверил ещё раз на всякий, нету.
в чём же косяк может быть?

laimas 09.03.2015 18:10

charset=iso-8859-1, она же windows-1251.

Это с каких пор, если iso-8859-1 всегда была Latin-1?

Не передает у вас сервер заголовок charset, хотя вы пишите а htaccess прописано AddDefaultCharset UTF-8 , а iso-8859-1, это как раз по умолчанию работа многих php-функций.

А какие настройки имеет сервер, в панели управления смотрели?

Arcoslov 09.03.2015 18:18

Цитата:

Сообщение от laimas (Сообщение 360371)
charset=iso-8859-1, она же windows-1251.

Это с каких пор, если iso-8859-1 всегда была Latin-1?

https://ru.wikipedia.org/wiki/ISO_8859-1

Цитата:

Сообщение от laimas (Сообщение 360371)
Не передает у вас сервер заголовок charset, хотя вы пишите а htaccess прописано AddDefaultCharset UTF-8 , а iso-8859-1, это как раз по умолчанию работа многих php-функций.

А какие настройки имеет сервер, в панели управления смотрели?

в htaccess прописано AddDefaultCharset utf-8, я даже этот файл пресоздавал.
А какие могут быть на сервере настройки, если это хостинг обычный?..

laimas 09.03.2015 18:39

Ну так 1252, и не 1251 :)

Что значит хостинг обычный, а что бывают необычные? )

У вас что кроме FTP другого доступа нет к хосту: РМА, панель управления, где можно определять настройки РНР, добавлять задания планировщику задач, управлять почтовыми ящиками и т.д.?

Arcoslov 09.03.2015 18:44

laimas, опечатка, извиняюсь. Конечно, 1252.

Да, к хостингу есть панель управления cpanel. Определять настройки php там негде, только версию можно выбрать, сейчас 5.3.
Какие конкретно настройки нужны?
крон и PMA есть, но они наверное, не в нашу кассу.

laimas 09.03.2015 18:57

Кодировка по умолчанию естественно.

Могу привести пример, когда на одном из хостов rucentr, переопределить кодировку посредством .htaccess не получается, и такое может встречаться. В панели, в настройках РНР смотрите, что определено.

Ну а то что файлы должны быть тоже в utf и без ВОМ, это вы точно знаете.

Arcoslov 09.03.2015 19:00

Без BOM это да. проверял все файлы.
Кодировку определить там негде.

danik.js 09.03.2015 19:04

Мучай техподдержку. Выкинь все из .htaccess кроме чарсета, создай простой php файл с echo 'Бла бла' и пиши гневное письмо.

laimas 09.03.2015 19:19

Да, возможно придется разбираться с техподдержкой.

Но сперва можно проверить - создать такой тестовый php-файл
<script>alert(document.charset)</script>


больше ничего не надо, запустить его но не из корня документов, а из любой публичной папки на сервере. Если будет UTF, то .htaccess пашет.

Arcoslov 09.03.2015 22:43

Цитата:

Сообщение от danik.js
Выкинь все из .htaccess кроме чарсета, создай простой php файл с echo 'Бла бла' и пиши гневное письмо.

Создал тестовый вариант. Два файла. Содержимое первого файла (index.php):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
 <meta http-equiv="Content-Language" content="ru">
<script language="javascript" type="text/javascript" src="http://mysite.com/jquery.js"></script>


<script language="javascript" type="text/javascript">alert('inputEncoding '+document.inputEncoding); //utf8
alert('characterSet '+document.characterSet ); //utf8
alert('charset '+ document.charset); //utf8
alert('defaultCharset '+document.defaultCharset); //windows-1252

function subm()
{
	var form=new Object();
	form['text']=$('#text')[0].value;
		
			$.post( 'http://mysite.com/test/test.php?page=order',form,
		function(answer,post_status)
		{
			if(post_status!='success')
				alert('Ошибка. Операция не выполнена.');
			else
				if(answer)
				 document.write(answer);
		});
		
}

</script>
</head>

<form action="test/test.php" method="post" accept-charset="utf-8">
<input type="text" name="text" id="text" value="" >
<input type="button" name="submit" value="Отправить" onclick="subm()">
</form>

</html>


Содержимое второго файла (test/test.php):
<script language="javascript" type="text/javascript">alert('inputEncoding '+document.inputEncoding); //utf8
alert('characterSet '+document.characterSet ); //utf8
alert('charset '+ document.charset); //utf8
alert('defaultCharset '+document.defaultCharset); //windows-1252</script>

<?php 
print_r($_REQUEST);
exit;
?>


в этом упрощённом примере всё работает. Не работает на сайте, хотя всё по аналогии. Значит, не серверные настройки виноваты. Значит, где-то в коде что-то неявным образом как-то куда-то конвертит.

Где копать то?

laimas 10.03.2015 04:25

Оставьте в покое defaultCharset, зачем она вам нужна?

Вам нужно проверить что возвращает сервер, судя по файлу test.php все нормально. Осталось проверить как принимает сервер, возможно у вас на сервере русский Апач, с которым бывают проблемы (или связка Apache+nginx, и отдает не Apache, а nginx).

Запустите (два файла раздельных, хотя количество роли не играет, что с одного проверять, что с раздельных, без разницы). Ремируйте в htaccess добавление кодировки, и будем считать, что на сервере в настройках она не определена по умолчанию, определять ее будет непосредственно переданный заголовок. НИКАКИХ метатегов о кодировке в документе чтобы не было, document.charset не интересует, тем более что в данном случае это значение может быть и не определено.

<?
header('Content-type: text/html; charset=utf-8');
?>
<!DOCTYPE HTML> 
<html> 
<head>
<script src="https://code.jquery.com/jquery-1.11.2.js"></script>
<script>
$(function() {
    $('form').submit(function() {
        $.post('2.php', $(this).serialize(), function(d) {
            alert(d)
        });
        return false;     
    })
});
</script>     
</head> 
<body>
<form>
<input name="as" value="Текст" />
<button>Отправить</button>
</form>
</body>
</html>


Это тот кто отвечает на запрос. Его задача - детектирование кодировки запроса и выдача результата.

<?php
$char = detectEncoding($_POST['as']);

header('Content-type: text/html; charset=utf-8');
exit('Кодировка: ' . $char . ', ' . $_POST['as']);

function detectEncoding($s) {  
    $enc = array('utf-8', 'windows-1251', 'windows-1252'); 
    foreach($enc as $v) { 
        $chk = iconv($v, $v, $s); 
        if(md5($chk) == md5($s)) return $v; 
    } 
    return 'Не определено'; 
}
?>


Проверяйте, и каков результат?

Arcoslov 10.03.2015 19:44

utf-8 выдало.
о чём это говорит?...

laimas 10.03.2015 19:59

И текст читаем?
А теперь удалите передачу заголовков РНР, в htaccess раскомментируйте добавление utf, и выполните это же самое (то есть никаких метатегов на странице).
Если при этом получится глюк, значит в техподдержку.

Arcoslov 10.03.2015 20:24

включил в htaccess, выключил заголовки в php файлах, всё равно всё на русском, ut-8 и читабельно.

Вот что Response headers я вижу:
Connection keep-alive
Content-Encoding gzip
Content-Type text/html; charset=utf-8
Date Tue, 10 Mar 2015 17:23:53 GMT
Server nginx admin
Transfer-Encoding chunked
Vary Accept-Encoding
X-Powered-By PHP/5.3.29

а вот что я вижу в случае моего сайта:
Connection keep-alive
Content-Encoding gzip
Content-Type text/html; charset=iso-8859-1
Date Tue, 10 Mar 2015 17:19:38 GMT
Server nginx admin
Transfer-Encoding chunked
Vary Accept-Encoding

:(

laimas 10.03.2015 20:31

Вот и ответ - катить бочку на хостера нет оснований, проблемы в скриптах серверных.


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