На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Проблема с перекодировкой UTF8 в Ansi, Если в исходном тексте присутсвует расширеный набор символов, то UTF8ToAnsi возвращает пустую строку
Доброго времени суток!
Получаю электронные письма через Indy
в теле письма проверяю на кодировку utf-8 и вызываю UTF8ToAnsi

ExpandedWrap disabled
      ...
      if AnsiUpperCase(fMail.CharSet)='UTF-8' Then fBody.Text:=UTF8ToAnsi(fMail.Body.Text)
      Else fBody.text:=fMail.Body.text;
      ...


Все прекрасно работает, но если в теле письма, обычно в афтарсокой подписи, содержатся символы-картинки, то
функция UTF8ToAnsi выдает пустую строку. Как только я удаляю руками эти символы, то функция прекрасно перекодирует все письмо.
Например, есть подпись
в utf-8 выглядит как Angelina????ᴾᴴᴼᵀᴼᴳᴿᴬᴾᴴᴱᴿ????
при просмотре в ansi выглядит как Angelina🍦ᴾᴴᴼᵀᴼᴳᴿᴬᴾᴴᴱᴿ🍦

вот из-за этих ????ᴾᴴᴼᵀᴼᴳᴿᴬᴾᴴᴱᴿ????
UTF8ToAnsi и косячит, выдавая пустой текст письма.

Подскажите, как вырезать такие вот украшательства из текста :-? ?, они мне не нужны для дальнейшей обработки письма >:( .
Получилось преобразовать. Может кому понадобится :) размещаю тут код.

ExpandedWrap disabled
    function FromUTF8 (const Src: String): WideString;
     var a,b,c: char;
         i,j: Integer;
     
    begin
      i:=1; j:=1;
      SetLength(result,length(src));
      while i<=length(src) do
      begin
        a:=src[i]; Inc(i);
        if byte(a)<$80 then
        begin
            result[j]:=wchar(a);
            Inc(j);
            continue;
        end;
        if i>length(src) then break;
        b:=src[i]; Inc(i);
        if (byte(a)<$E0) or (i>length(src)) then
        begin
            result[j]:=wchar(((byte(a) and $1F) shl 6) or (byte(b) and $3F));
            Inc(j);
            continue;
        end;
        c:=src[i]; Inc(i);
        result[j]:=wchar(((byte(a) and $F) shl 12) or ((byte(b) and $3F) shl 6) or (byte(c) and $3F));
        Inc(j);
      end;
      SetLength(result,j-1);
     
    end;
     
    function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
    var
      l: integer;
    begin
      if ws = '' then
        Result := ''
    else
      begin
        l := WideCharToMultiByte(codePage,
          WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
          @ws[1], -1, nil, 0, nil, nil);
        SetLength(Result, l - 1);
        if l > 1 then
          WideCharToMultiByte(codePage,
            WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
            @ws[1], -1, @Result[1], l - 1, nil, nil);
      end;
    end;
     
    function UTf8(Src:String):String;
    var st:String;
        wd:WideString;
    Begin
     st:='';
     st:=UTF8ToAnsi(Src);
     if st='' Then
      Begin
        wd:=FromUTF8(Src);
        st:=WideStringToString(wd,1251);
        st:=ReplaceStr(st,'?','');
      End;
     result:=st;
    End;
    ......




в основной процедуре, вызываю UTF8(fMail.Body.text), если CharSet установлен в UTF8
Сообщение отредактировано: snakess -
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0851 ]   [ 20 queries used ]   [ Generated: 20.06.18, 05:32 GMT ]