Свернутый текст
$mailinfo['subject'] = 'фывфывфывфыв';
$encode = detect_encoding($mailinfo['subject']);
if ($encode == 'utf-8') {
$conv_var = iconv ('UTF-8', 'KOI8-R', $mailinfo['subject']);
$encode_conv = detect_encoding($conv_var);
if ($encode_conv == 'KOI8-R') {
$encode_conv = 'yes koi8-r';
} else {
$encode_conv = 'not koi8-r';
}
}
работает правильно.
Внутри класса одного из проектов в функции эта же реализация неверно рабоатет
$encode = $this->detect_encoding($mailinfo['subject']);
if ($encode == 'utf-8') {
$conv_var = iconv ('UTF-8', 'KOI8-R', $mailinfo['subject']);
$encode_conv = $this->detect_encoding($conv_var);
if ($encode_conv == 'KOI8-R') {
$encode_conv = 'yes koi8-r';
} else {
$encode_conv = 'not koi8-r';
}
}
Суть класса в том что он собирает почту с указанного адресса и забивает в админку. Тикеты составляет. Когда через оутлук в саппорт отправляется письмо с заголовком на русском языке он не правильно воспринимает заголовок. Все php файлы настроены на utf-8 без бом.
Учитывая что дебагить сложно я хочу просто что бы он мне в заголовки письма выводил кодироку. utf-8 выводит. после принудительного перевода в KOI8-R он вся равно выводит utf-8 или же как в моем примере not koi8-r.
Как можно решить проблему может я неправильными ф-ми пользуюсь. Может вообще по другому нужно делать.
Функцию по определению кодировки detect_encoding взял с мануала
Свернутый текст
function detect_encoding($string) {
static $list = array('utf-8', 'KOI8-R');
foreach ($list as $item) {
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string))
return $item;
}
return null;
}
Спустя 29 минут, 7 секунд (28.01.2012 - 13:23) neadekvat написал(а):
Спустя 16 минут, 29 секунд (28.01.2012 - 13:39) SoMeOnE написал(а):
neadekvat
спасибо за ссылки.
спасибо за ссылки.
Спустя 1 день, 11 часов, 13 минут, 11 секунд (30.01.2012 - 00:52) SoMeOnE написал(а):
С помощью этих статей определить кодировку получилось. Она приходит из outlook в iso8859.
Теперь думаю нужно ее перевести в utf-8 что бы браузер правильно отображал.
iconv не помогает. Стандартные методы здесь тоже естественно не помогают как я понимаю.
Как эту проблему можно решить?
Теперь думаю нужно ее перевести в utf-8 что бы браузер правильно отображал.
iconv не помогает. Стандартные методы здесь тоже естественно не помогают как я понимаю.
Как эту проблему можно решить?
Спустя 4 минуты, 10 секунд (30.01.2012 - 00:56) neadekvat написал(а):
Спустя 3 минуты, 7 секунд (30.01.2012 - 01:00) SoMeOnE написал(а):
Еще один момент. Я знаю что заголовок вроде бы приходит в iso8859-5. Когда я в браузере ставлю эту кодировку, он вся равно неверно отобржает его. Это значит, что я все таки неверно опять определил кодировку или...?
Спустя 1 минута, 30 секунд (30.01.2012 - 01:01) neadekvat написал(а):
Как ты его отображаешь в браузере?
Копируешь с почты?
А в какой кодировке сохраняешь файл, который потом открываешь в браузере?
Копируешь с почты?
А в какой кодировке сохраняешь файл, который потом открываешь в браузере?
Спустя 8 минут, 31 секунда (30.01.2012 - 01:10) SoMeOnE написал(а):
neadekvat
Саму почту отправляю через отлук на другую почту саппорт.
Крон забирает с почты саппорт это письмо и заносит в базу.
Что бы проверить какая кодировка я прописал ее в названии темы. Получил iso8859-5.
Теперь что бы просмотреть старые тикеты в админке я меняю кодировку в браузере на ISO - 8859 - 5. Но опять нечитабельный заголовок остается.
Файл, который вызывается кроном и собирает почту сохранен в utf-8 без бом.
Речь только о заголовке письма.
Саму почту отправляю через отлук на другую почту саппорт.
Крон забирает с почты саппорт это письмо и заносит в базу.
Что бы проверить какая кодировка я прописал ее в названии темы. Получил iso8859-5.
Теперь что бы просмотреть старые тикеты в админке я меняю кодировку в браузере на ISO - 8859 - 5. Но опять нечитабельный заголовок остается.
Файл, который вызывается кроном и собирает почту сохранен в utf-8 без бом.
Речь только о заголовке письма.
Спустя 3 минуты, 40 секунд (30.01.2012 - 01:13) SoMeOnE написал(а):
В мануале прописано что utf8_encode преобразует из ISO-8859-1. Проблем с ISO - 8859 - 5 не будет. Это одинаковые кодировки. В вики написано, что семейство одинаковое, но какие то различия имеются?
Спустя 5 минут, 4 секунды (30.01.2012 - 01:18) neadekvat написал(а):
SoMeOnE, даже если бы я хотел знать все, не думаю, что знание кодировок, которые не поддерживают кириллические символы, нужно мне.
Могу лишь посоветовать поковыряться в спецификациях. Или гугле.
Могу лишь посоветовать поковыряться в спецификациях. Или гугле.
Спустя 1 минута, 17 секунд (30.01.2012 - 01:20) killer8080 написал(а):
Цитата (SoMeOnE @ 28.01.2012 - 11:53) |
Суть класса в том что он собирает почту с указанного адресса и забивает в админку. |
Каким способом собирает? И что находится в $mailinfo['subject']? Кодировка должна быть указана в самом письме в Content-Type, и в самой теме
'=?utf-8?b?'. base64_encode($subject) .'?='
Спустя 24 минуты, 39 секунд (30.01.2012 - 01:44) SoMeOnE написал(а):
killer8080
Там довольно большой проект Osticket. Я просто немного знаю принцип работы.
Когда с самого браузера создаешь тикет в кодировке ютф то все правильно работает. Когда с оутлука отправляешь то за переменные отвечает во эта ф-ия
Вот это я сам вписал что бы проверить какая кодировка у заголовка, воспользовавшись функцией с хабра.
и соответственно здесь поменял.
Теперь в заголовке приходит iso8859-5
А в оригинале было так.
mime_decode
Здесь сложно разбираться со всеми этими ф-ми. Хочу просто опрделить кодировку письма. перевести в ютф и потом послать в базу. Что можно сделать.
Там довольно большой проект Osticket. Я просто немного знаю принцип работы.
Когда с самого браузера создаешь тикет в кодировке ютф то все правильно работает. Когда с оутлука отправляешь то за переменные отвечает во эта ф-ия
Свернутый текст
function createTicket($mid,$emailid=0){
global $cfg;
$mailinfo=$this->getHeaderInfo($mid);
//Make sure the email is NOT one of the undeleted emails.
if($mailinfo['mid'] && ($id=Ticket::getIdByMessageId(trim($mailinfo['mid']),$mailinfo['from']['email']))){
//TODO: Move emails to a fetched folder when delete is false??
return false;
}
$encode = $this->detect_encoding($mailinfo['subject']);
$conv_var = iconv ('iso8859-5', 'UTF-8', $mailinfo['subject']);
$conv_encode = $this->detect_encoding($conv_var);
$var['name']=$this->mime_decode($mailinfo['from']['name'], $mid);
$var['email']=$mailinfo['from']['email'];
$var['subject']=$conv_encode;
$var['message']=Format::stripEmptyLines($this->getBody($mid));
$var['header']=$this->getHeader($mid);
$var['emailId']=$emailid?$emailid:$cfg->getDefaultEmailId(); //ok to default?
$var['name']=$var['name']?$var['name']:$var['email']; //No name? use email
$var['mid']=$mailinfo['mid'];
if($cfg->useEmailPriority())
$var['pri']=$this->getPriority($mid);
$ticket=null;
$newticket=true;
//Check the subject line for possible ID.
if(preg_match ("[[#][0-9]{1,10}]",$var['subject'],$regs)) {
$extid=trim(preg_replace("/[^0-9]/", "", $regs[0]));
$ticket= new Ticket(Ticket::getIdByExtId($extid));
//Allow mismatched emails?? For now NO.
if(!$ticket || strcasecmp($ticket->getEmail(),$var['email']))
$ticket=null;
}
$errors=array();
if(!$ticket) {
if(!($ticket=Ticket::create($var,$errors,'Email')) || $errors)
return null;
$msgid=$ticket->getLastMsgId();
}else{
$message=$var['message'];
//Strip quoted reply...TODO: figure out how mail clients do it without special tag..
if($cfg->stripQuotedReply() && ($tag=$cfg->getReplySeparator()) && strpos($var['message'],$tag))
list($message)=split($tag,$var['message']);
$msgid=$ticket->postMessage($message,'Email',$var['mid'],$var['header']);
}
//Save attachments if any.
if($msgid && $cfg->allowEmailAttachments()){
if(($struct = imap_fetchstructure($this->mbox,$mid)) && $struct->parts) {
if($ticket->getLastMsgId()!=$msgid)
$ticket->setLastMsgId($msgid);
$this->saveAttachments($ticket,$mid,$struct);
}
}
return $ticket;
}
Вот это я сам вписал что бы проверить какая кодировка у заголовка, воспользовавшись функцией с хабра.
$encode = $this->detect_encoding($mailinfo['subject']);;
и соответственно здесь поменял.
$var['subject']=$encode ;
Теперь в заголовке приходит iso8859-5
А в оригинале было так.
$var['subject']=$mailinfo['subject']?$this->mime_decode($mailinfo['subject'], $mid):'[No Subject]';
mime_decode
Свернутый текст
function mime_decode($text, $mid) {
if(!$struct && $mid)
$struct=@imap_fetchstructure($this->mbox, $mid);
$a = imap_mime_header_decode($text);
$str = '';
foreach ($a as $k => $part)
$str.= $part->text;
if($struct->encoding==3 or $struct->encoding==4) //base64 and qp decode.
$str=$this->decode($struct->encoding,$str);
$charset=null;
if($struct->ifparameters){
if(!strcasecmp($struct->parameters[0]->attribute,'CHARSET') && strcasecmp($struct->parameters[0]->value,'US-ASCII'))
$charset=trim($struct->parameters[0]->value);
}
$str=$this->mime_encode($str,$charset);
return $str?$str:imap_utf8($text);
}
Здесь сложно разбираться со всеми этими ф-ми. Хочу просто опрделить кодировку письма. перевести в ютф и потом послать в базу. Что можно сделать.
Спустя 2 минуты, 20 секунд (30.01.2012 - 01:47) SoMeOnE написал(а):
Цитата (killer8080 @ 29.01.2012 - 22:20) | ||
Каким способом собирает? И что находится в $mailinfo['subject']? Кодировка должна быть указана в самом письме в Content-Type, и в самой теме '=?utf-8?b?'. base64_encode($subject) .'?=' |
Собирает кроном. в переменной находится заголовок письма. Когда написан английскими буквами все нормально, когда русскими буквами все плохо. Если через оутлук создавать.
Тело письма отображается нормально при этом.
Спустя 21 час, 34 минуты, 49 секунд (30.01.2012 - 23:21) killer8080 написал(а):
SoMeOnE
вот тут
вот тут
$a = imap_mime_header_decode($text);функция imap_mime_header_decode возвращает массив с объектами. Кроме $part->text, там есть $part->charset в которой содержится кодировка. Можно попробовать так
$str = '';
foreach ($a as $k => $part)
$str.= $part->text;
$a = imap_mime_header_decode($text);
$str = '';
foreach ($a as $k => $part)
$str.= iconv($part->charset, 'UTF-8', $part->text);
Спустя 16 часов, 54 минуты, 52 секунды (31.01.2012 - 16:16) SoMeOnE написал(а):
killer8080
Я около 10 часов в общей сложности возился с этой проблемой)))
Ты гений. Как ты незная, что там вообще происходит конкретно сходу нашел ответ?
Я уж думал меня штрафанут на работе за задержку)))
Я около 10 часов в общей сложности возился с этой проблемой)))
Ты гений. Как ты незная, что там вообще происходит конкретно сходу нашел ответ?
Я уж думал меня штрафанут на работе за задержку)))
Спустя 22 минуты, 34 секунды (31.01.2012 - 16:39) killer8080 написал(а):
SoMeOnE
я не гений, я просто умею читать мануалы
я не гений, я просто умею читать мануалы

Спустя 1 час, 5 минут, 4 секунды (31.01.2012 - 17:44) SoMeOnE написал(а):
killer8080
Ну да логично...) Еще раз спасибо.
Ну да логично...) Еще раз спасибо.