Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка при использовании convert_cyr_string
 
 автор: MacVit   (05.08.2004 в 12:26)   письмо автору
 
 

Добрый день, я новичек в PHP
Я делаю преобрзование кодировки из одной в другую при отправке письма по почте. Почта работает нормально, текст читабелен, но на странице, которая сообщает о успешном выполнении отправки письма содержится строка и я не знаю в чем дело и как решить даннную проблему.
Буду рад, если кто поможет, желательно подробнее...
Вот сообщение:
Notice: Use of undefined constant w - assumed 'w' in D:\wwwrootiis\Lancom_video\email.php on line 20
Notice: Use of undefined constant k - assumed 'k' in D:\wwwrootiis\Lancom_video\email.php on line 20
Вот строка кода:
$msg_admin = convert_cyr_string ($msg_admin,w,k);

   
 
 автор: bonis   (05.08.2004 в 12:47)   письмо автору
 
   для: MacVit   (05.08.2004 в 12:26)
 

Все оч просто, буковки возьми в кавычки, примерно вот так:
$msg_admin = convert_cyr_string ($msg_admin,'w','k');

   
 
 автор: MacVit   (05.08.2004 в 13:05)   письмо автору
 
   для: bonis   (05.08.2004 в 12:47)
 

УРА!!! ЗАРАБОТАЛО!!! Большое спасибо!

   
 
 автор: Crux   (12.01.2005 в 22:37)   письмо автору
 
   для: MacVit   (05.08.2004 в 13:05)
 

а как определить в какой кодировки написан какой-либо текст??

   
 
 автор: cheops   (12.01.2005 в 23:09)   письмо автору
 
   для: Crux   (12.01.2005 в 22:37)
 

Это достаточно проблематично... обычно это делается на глазок или из каких-то предпосылок, эту информацию можно извлечь из HTTP-заголовков - в общем методы решения задачи определяются конекстом.

   
 
 автор: Crux   (13.01.2005 в 00:13)   письмо автору
 
   для: cheops   (12.01.2005 в 23:09)
 

HTTP-заголовки здесь не играют ни какой роли
на глазок... это конечно хорошо (так оно в данном случае и делается), но тоже не пойдёт

попробую объяснить свою проблему

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

выдёргивая информацию из почтовых заголовок можно получить довольно таки интересны текст, например тема письма может выглядеть так:

=?KOI8-R?Q?=EE=EF=F7=EF=E5_=F7_=F0=EF=FE=F4=EF=F7=EF=EA?= =?KOI8-R?Q?_=F3=EC=F5=F6=E2=E5_=EE=E7=F3_?=

=?windows-1251?B?z/Du9/Ll7e46IHRlc3Rpbmc=?=

чЩУЛПТЛП нБЛУЙНaspid02@ngs.ru>


впринципе здесь нет чего-либо страшного...
так как я не нашел такой функции в PHP чтоб это всё спокойно перекодировалось в человеческий вид, я написал свой небольшой кодик


<?
$subject
="=?KOI8-R?Q?=EE=EF=F7=EF=E5_=F7_=F0=EF=FE=F4=EF=F7=EF=EA?= =?KOI8-R?Q?_=F3=EC=F5=F6=E2=E5_=EE=E7=F3?=";

print 
"sub=".conv($subject);

function 
conv($subject)
{
$s_sub=convert_cyr_string($subject,"k","w");;
$koi="=?koi8-r?B?"
$win="=?WINDOWS-1251?Q?";
$koi2="=?KOI8-R?Q?";
$win2="=?windows-1251?B?";

if (
strstr($subject,$win2)) 
    { 
    
$s_sub substr($subject,strlen($win2)); 
    
$s_sub base64_decode ($s_sub); 
    }

if (
strstr($subject,$koi)) 
    { 
    
$s_sub substr($subject,strlen($koi)); 
    
$s_sub base64_decode ($s_sub); 
    
$s_sub convert_cyr_string ($s_sub,"k","w");
    }
    
if (
strstr($subject,$win) || stristr($subject,$koi2))
    {
    
    if (
stristr($subject,$koi2)) $str2=$koi2;
    if (
strstr($subject,$win)) $str2=$win;
    
$string=explode($str2,$subject);
    
$st=$string[0];
    for (
$ll=0$ll<count($string); $ll++)
        {
        
$s=explode("=",$string[$ll]);
        if (
count($s)!=1)
            {
            for (
$qq=0$qq<count($s); $qq++)
                {
                
$st.=chr(hexdec($s[$qq]));
                    if (
strstr($s[$qq],"_"))
                        {
                        
$st.=substr($s[$qq],2,strlen($s[$qq])-3);
                        
$st.=" ";
                        }
                    elseif (
count($s)-2!=$qq$st.=substr($s[$qq],2,strlen($s[$qq])-2);
                        else 
$st.=substr($s[$qq],2,strlen($s[$qq])-3);
                }
            }
        }
    
$s_sub=$st;
//    if (stristr($subject,$koi2)) $s_sub=convert_cyr_string ($s_sub,"k","w");
    
}
return 
$s_sub;
}
?>


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

sub= опчпе ч рпюфпчпк умхцве озу

если же разремировать строчку
//    if (stristr($subject,$koi2)) $s_sub=convert_cyr_string ($s_sub,"k","w");

,то должно по идеи вывести
sub= НОВОЕ В ПОЧТОВОЙ СЛУЖБЕ НГС
, но выводит только sub=

вот одна из самых больных проблем, которая последнее несколько дней сводит меня с ума, если кто-нибудь сможет помочь, я клятвенно клянусь, что тому человеку скажу БОЛЬШОЕ спасибо.

   
 
 автор: cheops   (13.01.2005 в 00:45)   письмо автору
 
   для: Crux   (13.01.2005 в 00:13)
 

Но ведь можно указывать в почтовых заголовка кодировку письма - пущай ретронсляторы данные в 7-битной кодировки шлют - пользовательский почтовый агент штука умная и не в 70-е делалась... она разберётся если ей указать кодировку...

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1339

   
 
 автор: glsv (Дизайнер)   (13.01.2005 в 01:44)   письмо автору
 
   для: Crux   (13.01.2005 в 00:13)
 

Видимо после перекодировок при выполнении блока кода в условии

if (strstr($subject,$win) || stristr($subject,$koi2))
…..

В тексте не остается кириллических символов. Вы же там как раз с кодами символов "играете".
И функция convert_cyr_string() все символы, которые не относятся к кириллице просто удаляет.

   
 
 автор: glsv (Дизайнер)   (13.01.2005 в 02:20)   письмо автору
 
   для: glsv (Дизайнер)   (13.01.2005 в 01:44)
 

Нет, я не совсем был прав.
Функция convert_cyr_string() спотыкается о самый первый символ в строке $s_sub. Там идет символ с кодом 0. Что вообще говоря означает "конец строки". И потому поведение функции вполне закономерно.
Как только convert_cyr_string() встречает такой символ перекодировка прекращается.
Измените остаток кода следующим образом:

<?
     $s_sub 
substr($s_sub1);
     if (
stristr($subject,$koi2))
     {
       
$s_sub=convert_cyr_string($s_sub,"k","w"); 
     } 
  } 
  
header('Content-type: text/html; charset=windows-1251');
  return 
$s_sub

?>


У меня это выводит
sub=НОВОЕ В ПОЧТОВОЙ

Я посмотрел по кодам символов. После кода буквы Й опять идет символ с кодом 0.

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

   
 
 автор: Crux   (13.01.2005 в 14:15)   письмо автору
 
   для: glsv (Дизайнер)   (13.01.2005 в 02:20)
 

как и обещал, Дизайнеру БОЛЬШОЕ СПАСИБО.

   
 
 автор: Crux   (13.01.2005 в 16:07)   письмо автору
 
   для: Crux   (13.01.2005 в 14:15)
 

нашел функцию котороя занимается данной перекодировекой
iconv_mime_encode()
вот только она работать будет начиная с 5-ой версии PHP
и ещё должен быть подключен модуль php_iconv.dll

   
 
 автор: glsv (Дизайнер)   (12.01.2005 в 23:11)   письмо автору
 
   для: MacVit   (05.08.2004 в 12:26)
 

>Notice: Use of undefined...

Notice - это советы по кодирование. Их вывод следует отключить. Они также отключены на всех хостингах.
В файле php.ini поставьте следующее значение директивы error_reporting
error_reporting  = E_ALL & ~E_NOTICE

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования