Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чем преобразовать UTF-8 в Windows-1251


Делфиец ©   (2010-10-27 08:49:00) 

Если кто знает есть ли в JEDI конвертеры кодировок?
Ищу подходящий модуль желательно универсальный, что бы разные кодировки преобразовывал чем больше тем лучше или пакет модулей, если кто знает подскажите пожалуйста.


Anatoly Podgoretsky   (2010-10-30 10:19:00) [1]


> =?UTF-8?B?0K

До UTF тут еще далеко.


Eraser   (2010-10-29 23:46:00) [2]

см. UTF8ToString и прочее для декодирования в юникод.

для кодирования см. TEncoding.


Делфиец   (2010-10-29 20:57:00) [3]


> Игорь Шевченко ©   (29.10.10 20:52) [9]

Хм.. точно рулез.
RFC - а куда же нам без него?


Игорь Шевченко   (2010-10-29 20:52:00) [4]

Читать, читать и еще раз читать.
RFC - они рулез


Делфиец   (2010-10-29 20:38:00) [5]

Что бы из это строки =?UTF-8?B?0K/QvdC40L0g0JDQu9C10LrRgdC10Lk=?= получить текст в формате UTF-8 нужно извлеть строку 0K/QvdC40L0g0JDQu9C10LrRgdC10Lk= и пропустить через MIME декодер, но этого ИНДИ делать не будет по то как не заточен под это, хотя сдается мне, что все строки закодированы одинаково, что с такой KOI-8 или с такой windows-1251, iso-8859 кодировкой. Всего то нужно поменять UTF-8 на то, что понимает ИНДИ и он сам извлечет нужную строку и декодирует за вас ее в UTF-8


Делфиец   (2010-10-29 20:14:00) [6]


> Игорь Шевченко ©   (29.10.10 20:05) [6]


смотреть сЮда
Это все с чем ИНДИ работает, я то говорю про то, как его научть работать с остальным.
 
 // ...................................
 // Get the Charset part.
 EncodingBeforeEnd := -1;
 LEncodingStartPos := PosIdx('=?ISO', Sys.UpperCase(Header), 1); {do not localize}
 if LEncodingStartPos = 0 then begin
   LEncodingStartPos := PosIdx('=?WINDOWS', Sys.UpperCase(Header), 1); {do not localize}
 end;
 if LEncodingStartPos = 0 then begin
   LEncodingStartPos := PosIdx('=?KOI8', Sys.UpperCase(Header), 1); {do not localize}
 end;
// .................


Игорь Шевченко   (2010-10-29 20:05:00) [7]

Ужос на крыльях ночи.
Читать наизусть RFC 2045
http://tools.ietf.org/html/rfc2045


Делфиец   (2010-10-29 19:57:00) [8]

Преодолел наконец то казалось бы неприодолимое. Если кому будет интересно то можете воспользоваться этим советом.
Проблема: При получении письма в кодировке UTF-8 некоторые поля отображаются в таком виде, например IdMessage.From.Name = '=?UTF-8?B?0K/QvdC40L0g0JDQu9C10LrRgdC10Lk=?='. Немного покапавшись в unit IdCoderHeader.pas, который используется для декодирования - полностью убедился, что UTF-8 не поддерживается т.е. он его никак не парсит.  Что бы привести подобные поля заголовков в читаемый вид, нужно сделать свой парсер руками, но это дело не совсем из приятных.  
Решение проблемы:
Используем все тот же юнит.

Вот функция при помощи которой можно и парсить и декодировать Headers

Uses IdCoderHeader;

function TFrmMain.UTF8Decode(StrValue: String): String;
begin
 if StrValue = '' then exit;
 // Великий смысл этого кода в том, что UTF-8 ни как не парсится, а KOI-8, windows-1251, iso-8859 парсится
 // значит меняем KOI-8 в строке '=?UTF-8?B?0K/QvdC40L0g0JDQu9C10LrRgdC10Lk=?=' на любой из них и пропускаем через декодер    
 StrValue := StringReplace(StrValue,'UTF-8','KOI-8',[rfIgnoreCase,rfReplaceAll]);
 // Испотльзуем IdCoderHeader.DecodeHeader() которая запросто будет парсить наш хейдер
 Result := Utf8ToAnsi(DecodeHeader(StrValue));
 // И на выходе получаем нормальный текст...
end;


Медвежонок Пятачок   (2010-10-27 10:59:00) [9]

потому что это не утф-8


Делфиец   (2010-10-27 10:48:00) [10]

Почему то не получается.
Почему то IdMessage.From или IdMessage.Subject возвращают строку как есть в таком формате =?UTF-8?B?0K/QvdC40L0g0JDQu9C10LrRgdC10Lk=?=
Так полагаю, что строка должна предварительно еще декодироваться, но почему то не декодируется. Может кто-нибудь знает?

Я попробовал так сделать:
FrmMain.IdDecoderMIME1.DecodeString(IdMessage.From)

получилась ерунда не похожая ни на что   ях\x13\x1Fяя\xFэ
эЭЌТ

Ѕ]­\x18\x1D]џя

я эту ерунду вставил в текстовый редактор Notepad++, а затем перебрал все кодировки - увы читаемым текстом не стало.


Palladin   (2010-10-27 10:32:00) [11]

набери три буквы utf и нажми ctrl-space


Anatoly Podgoretsky   (2010-10-27 08:50:00) [12]

> Делфиец  (27.10.2010 08:49:00)  [0]

MultiByteToWideChar


Наверх

Титульная страница Поиск, карта сайта Написать письмо