Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.23;
Скачать: CL | DM;

Вниз

Чем преобразовать UTF-8 в Windows-1251   Найти похожие ветки 

 
Делфиец   (2010-10-27 08:49) [0]

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


 
Anatoly Podgoretsky ©   (2010-10-27 08:50) [1]

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

MultiByteToWideChar


 
Palladin ©   (2010-10-27 10:32) [2]

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


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

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

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

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

Ѕ]­]џя

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


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

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


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

Преодолел наконец то казалось бы неприодолимое. Если кому будет интересно то можете воспользоваться этим советом.
Проблема: При получении письма в кодировке 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-29 20:05) [6]

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


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


> Игорь Шевченко ©   (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:38) [8]

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


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

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


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


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

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


 
Eraser ©   (2010-10-29 23:46) [11]

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

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


 
Anatoly Podgoretsky ©   (2010-10-30 10:19) [12]


> =?UTF-8?B?0K

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



Страницы: 1 вся ветка

Текущий архив: 2011.01.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1288418090
ilyas09
2010-10-30 09:54
2011.01.23
Приостановить выполнение потока на 1 мс или меньше.


2-1288543652
mefodiy
2010-10-31 19:47
2011.01.23
Юникод в DBGrid


2-1288203552
ZV
2010-10-27 22:19
2011.01.23
Как изменить шрифт набираемого кода в Delphi2009


15-1286742549
Юрий
2010-10-11 00:29
2011.01.23
С днем рождения ! 11 октября 2010 понедельник


15-1286569751
Юрий
2010-10-09 00:29
2011.01.23
С днем рождения ! 9 октября 2010 суббота