![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чем преобразовать 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