Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AJAX PHP EMAIL - кодировка ? Исправление проблемы с кодировкой письма 
:(
    Опции темы
navodri
Дата 27.11.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Здравствуйте, уважаемые?
Используя AJAX, столкнулся с проблемой в кодировке. в ПХП-скрипте прописал header("Content-Type: text/html; charset=\"windows-1251\""); . Это исправило отображение сообщений на странице. Но суть проблемы в отправке письма. Вместо текста в письмах цифры. Понятно, что проблема в UTF-8. Как получать письма в кодировке windows-1251? Пожалуйста, не отправляй в другие разделы сайта, а на моей примере покажите, что сделать:

Код

<?php
error_reporting(0);

header("Content-Type: text/html; charset=\"windows-1251\""); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 

  // configuration
  $email_it_to = "[email protected]";
  $error_message = "Пожалуйста, заполните форму.";
  $confirmation = "Ваше сообщение успешно отправлено.";
  
if(!isset($rnd) || !isset($name) || !isset($email) || !isset($subject) || !isset($body)) {
    echo $error_message;
    die();
}
    $email_from = $email;

    $email_subject = "Тема: ".iconv("iso8859-1", "UTF-8", stripslashes($subject));

    $email_message = "Отправитель: '".stripslashes($name);
    $email_message .="' on ".date("d/m/Y")." at ".date("H:i")."\n\n";
    $email_message .="======== НАЧАЛО СООБЩЕНИЯ =======\n";
    $email_message .= iconv("iso8859-1", "UTF-8", stripslashes($body));
    $email_message .="\n======== КОНЕЦ СООБЩЕНИЯ ========";

    $headers = 'From: '.$email_from."\r\n".'Reply-To: '.$email_from."\r\n".'X-Mailer: PHP/'.phpversion();

    mail($email_it_to, $email_subject, $email_message, $headers);

    echo "<b>$confirmation</b>";
    die();
?>

PM MAIL WWW   Вверх
vasac
Дата 27.11.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(navodri @  27.11.2007,  11:33 Найти цитируемый пост)
Вместо текста в письмах цифры.

Пример исходного текста и цифр.

Цитата(navodri @  27.11.2007,  11:33 Найти цитируемый пост)
Понятно, что проблема в UTF-8

Приведите ход своих мыслей. Мне это совершенно не понятно.

Цитата(navodri @  27.11.2007,  11:33 Найти цитируемый пост)
Как получать письма в кодировке windows-1251?

Получать?

Цитата(navodri @  27.11.2007,  11:33 Найти цитируемый пост)
Пожалуйста, не отправляй в другие разделы сайта

А вы пишите сразу в том разделе в каком надо и не перенаправят.
PM WWW   Вверх
navodri
Дата 27.11.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Пример файла отправки сообщения представлен выше. Сообщение приходит в виде: 

%u041A%u0456%u043B%u044C%u043A%u0456%u0441%u0442%u044C %u043B%u044E%u0434%u0435%u0439,

Перекодировать не выходит. Делал и так и этак...

Из скрипта видно, письма отправляются на почтовый адрес: [email protected]

Это сообщение отредактировал(а) navodri - 27.11.2007, 12:31
PM MAIL WWW   Вверх
ksnk
Дата 27.11.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Навскидку - надо разобраться с кодировками
  • откуда приходит письмо? Какая кодировка стоит в той страничке? 
  • header("Content-Type: text/html; charset=\"windows-1251\"");  означает, что эта страничка в кодировке win
  • "Тема: ".iconv("iso8859-1", "UTF-8", ... означает, что ожидаемый ввод - в кодировке iso8859-1 - оно действительно так?
  •  Где в письме указана кодировка?




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
navodri
Дата 27.11.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



сорри, напортачил... iconv перекодирует из УТФ в Виндоус:

iconv("UTF-8", "windows-1251","Тема письма, сообщении и .т.п");

но iconv всё-равно не работает. 

письмо отправляет юзер с моего сайта средствами АЯКСА на мой почтовый ящик: [email protected]. отправка идет на ура, но письмо приходит в виде: 

%u041A%u0456%u043B%u044C%u043A%u0456%u0441%u0442%u044C

Я так понимаю, это связано с тем, що AJAX использует кодироку UTF-8. Почему немогу получить нормальный текст непонятно. iconv, я так понимаю, не фурычит.




РЕБЯТА! Как мне это перекодировать: %u041A%u0456%u043B%u044C%u043A%u0456%u0441%u0442%u044C ?

Это сообщение отредактировал(а) navodri - 27.11.2007, 14:11
PM MAIL WWW   Вверх
vasac
Дата 27.11.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



На клиентской стороне функцией escape() злоупотребляли?
PM WWW   Вверх
ksnk
Дата 27.11.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Хм... RTFM


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
navodri
Дата 27.11.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Функцией escape злоупотреблял и неоднократно. Это плохо?


Код

function sendRequest() {
    var rnd = Math.random();
    var name = escape(document.getElementById("name").value);
    var email = escape(document.getElementById("email").value);
    var subject = escape(document.getElementById("subject").value);
    var body = escape(document.getElementById("body").value);

    try{
    http.open('POST', 'pform.php');
    http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    http.onreadystatechange = handleResponse;
    http.send('name='+name+'&email='+email+'&subject='+subject+'&body='+body+'&rnd='+rnd);
    }
    catch(e){}
    finally{}
}


Я понял, она предразует текст в символы типа %u0442%u044C . Можно как-нибудь ее обойти? Вроде обратных аналогов этой функции в ПХП нет.

Это сообщение отредактировал(а) navodri - 27.11.2007, 15:30
PM MAIL WWW   Вверх
ksnk
Дата 27.11.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



navodri, Можно попробовать использовать encodeURIComponent на стороне JS, а в PHP, если, конечно, надо - urldecode. Так меньше писать приходится...
Цитата(navodri @  27.11.2007,  15:21 Найти цитируемый пост)
Вроде обратных аналогов этой функции в ПХП нет

Ссылки, значит, не читаем?


Это сообщение отредактировал(а) ksnk - 27.11.2007, 15:31


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
navodri
Дата 27.11.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



2ksnk

Попробовал функцию utf8RawUrlDecode и получил:

& # 1042 ; & # 1083 ; & # 1072 ; & # 1076 ; & # 1080 ; & # 1084 ; & # 1080 ; & # 1088 ;

Как это всё расшифровать, привести в нормальный вид WINDOWS-кодировки? Странно то, что на этой форуме отображается всё нормально в виде: Владимир. У меня в почтовом ящике при выборе кодировки УТФ-8 всё-равно отображаются HEX-символы.


Это сообщение отредактировал(а) navodri - 27.11.2007, 16:11
PM MAIL WWW   Вверх
ksnk
Дата 27.11.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



задумался...

Это сообщение отредактировал(а) ksnk - 27.11.2007, 16:42


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
navodri
Дата 27.11.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Использование iconv не помогает:

Код

iconv("UTF-8","windows-1251",utf8RawUrlDecode(stripslashes($subject)));

PM MAIL WWW   Вверх
ksnk
Дата 27.11.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



А вот так?
Код

примеры натырены на php.net...
function uft8html2utf8( $s ) {
if ( !function_exists('uft8html2utf8_callback') ) {
function uft8html2utf8_callback($t) {
$dec = $t[1];
           if ($dec < 128) {
             $utf = chr($dec);
           } else if ($dec < 2048) {
             $utf = chr(192 + (($dec - ($dec % 64)) / 64));
             $utf .= chr(128 + ($dec % 64));
           } else {
             $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
             $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
             $utf .= chr(128 + ($dec % 64));
           }
           return $utf;
}
} 
return preg_replace_callback('|&#([0-9]{1,});|', 'uft8html2utf8_callback', $s ); 
}
function utf8RawUrlDecode ($source) {
    $decodedStr = "";
    $pos = 0;
    $len = strlen ($source);
    while ($pos < $len) {
        $charAt = substr ($source, $pos, 1);
        if ($charAt == '%') {
            $pos++;
            $charAt = substr ($source, $pos, 1);
            if ($charAt == 'u') {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr ($source, $pos, 4);
                $unicode = hexdec ($unicodeHexVal);
                $entity = "&#". $unicode . ';';
                $decodedStr .= utf8_encode ($entity);
                $pos += 4;
            }
            else {
                // we have an escaped ascii character
                $hexVal = substr ($source, $pos, 2);
                $decodedStr .= chr (hexdec ($hexVal));
                $pos += 2;
            }
        } else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }
    return $decodedStr;
}
// поехали... 
$s='%u041A%u0456%u043B%u044C%u043A%u0456%u0441%u0442%u044C';
$ss=utf8RawUrlDecode ($s);
$sss=uft8html2utf8($ss);
echo $ss,' ',$sss,' ',iconv('UTF-8','windows-1251',$sss);

Может лучше urldecode?
P.S. Всю жизнь пользовался jsHttpRequest'ом и горя не знал :(

Добавлено через 7 минут и 43 секунды
Кстати, если в нем посмотреть - то можно найти значительно более привелекательные функции...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
navodri
Дата 27.11.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Отлично! ksnk, огромное спасибо! Всё заработало. Полный листинг выглядит так:

Код

<?php
error_reporting(0);

  header("Content-Type: text/html; charset=\"windows-1251\""); 
  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
  header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); 
  header("Cache-Control: no-store, no-cache, must-revalidate"); 
  header("Cache-Control: post-check=0, pre-check=0", false); 
  header("Pragma: no-cache"); 

  // configuration
  $email_it_to = "ваша@почта.com"; //указываем свой почтовый адрес
  $error_message = "Пожалуйста, заполните форму.";
  $confirmation = "Ваше сообщение успешно отправлено.";

function uft8html2utf8( $s ) {    
if ( !function_exists('uft8html2utf8_callback') ) {    
function uft8html2utf8_callback($t) {    
$dec = $t[1];    
           if ($dec < 128) {    
             $utf = chr($dec);    
           } else if ($dec < 2048) {    
             $utf = chr(192 + (($dec - ($dec % 64)) / 64));    
             $utf .= chr(128 + ($dec % 64));    
           } else {    
             $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));    
             $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));    
             $utf .= chr(128 + ($dec % 64));    
           }    
           return $utf;
}    
}    
return preg_replace_callback('|&#([0-9]{1,});|', 'uft8html2utf8_callback', $s );    
}

function utf8RawUrlDecode($source) {
    $decodedStr = "";
    $pos = 0;
    $len = strlen($source);
    while ($pos < $len) {
        $charAt = substr($source, $pos, 1);
        if ($charAt == '%') {
            $pos++;
            $charAt = substr($source, $pos, 1);
            if ($charAt == 'u') {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr($source, $pos, 4);
                $unicode = hexdec($unicodeHexVal);
                $entity = "&#". $unicode . ';';
                $decodedStr .= utf8_encode($entity);
                $pos += 4;
            }
            else {
                // we have an escaped ascii character
                $hexVal = substr($source, $pos, 2);
                $decodedStr .= chr(hexdec($hexVal));
                $pos += 2;
            }
        } else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }
    return $decodedStr;
}

if(!isset($rnd) || !isset($name) || !isset($email) || !isset($subject) || !isset($body)) {
    echo $error_message;
    die();
}
    $email_from = $email;

    $email_subject = "Тема: ".iconv('UTF-8','windows-1251',uft8html2utf8(utf8RawUrlDecode(stripslashes($subject))));

    $email_message  = "Отправитель: ".iconv('UTF-8','windows-1251',uft8html2utf8(utf8RawUrlDecode(stripslashes($name))))."\n";
    $email_message .= "Дата отправки: ".date("d/m/Y").", время: ".date("H:i")."\n\n";
    $email_message .= "======== НАЧАЛО СООБЩЕНИЯ =======\n";
    $email_message .= iconv('UTF-8','windows-1251',uft8html2utf8(utf8RawUrlDecode(stripslashes($body))));
    $email_message .= "\n======== КОНЕЦ СООБЩЕНИЯ ========";

    $headers = 'From: '.$email_from."\r\n".'Reply-To: '.$email_from."\r\n".'X-Mailer: PHP/'.phpversion();

    mail($email_it_to, $email_subject, $email_message, $headers);

    echo "<b>$confirmation</b>";
    die();
?>

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.