На главную
ПРАВИЛА 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,0650 ]   [ 15 queries used ]   [ Generated: 22.09.18, 01:27 GMT ]