Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Расширенные коды символов в UTF8 [D7]


ford ©   (14.06.18 10:42

Доброго времени суток!
Получаю электронные письма через Indy
в теле письма проверяю на кодировку utf-8 и вызываю UTF8ToAnsi

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

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

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

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


RWolf ©   (14.06.18 11:07[1]

Перед преобразованием в ANSI просмотреть содержимое строки на предмет 4-байтных символов UTF-8 и повыкидывать их


ford ©   (14.06.18 13:22[2]


> RWolf ©   (14.06.18 11:07) [1]
>
> Перед преобразованием в ANSI просмотреть содержимое строки
> на предмет 4-байтных символов UTF-8 и повыкидывать их


Как, подскажи? Какой признак, что следующий символ это 4 байта?


ford ©   (14.06.18 13:24[3]

Пока, решил проблему так

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)
Через одно место конечно, и потом еще кучку вопросиков вырезаю из текста, но как "костыль" работает.


ford ©   (14.06.18 13:27[4]

Забыл еще одну функцию :)


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;


RWolf ©   (14.06.18 14:20[5]

В UTF-8 двухбайтные символы начинаются с байта 110xxxxx, трёхбайтные — с байта 1110xxxx, четырёхбайтные — 11110xxx.


QAZ ©   (14.06.18 19:26[6]

в чем проблема юзать функции винды?
MultiByteToWideChar( CP_UTF8, 0, PAnsiChar( s ), Len , Buffer, Len );


ford ©   (15.06.18 12:46[7]


> RWolf ©   (14.06.18 14:20) [5]

Сенкю вери мач


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо