Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Unicode, UTF8


readline(); ©   (2007-08-28 17:44:00) 

Сижу читаю инфу по поводу юникода, но наткнулся вот в сети на некоторый код, который перобразует UTF8 в Ansi строку -- функция UTF8ToStrSmart. Но я не понимаю смысл этой функции, зачем она нужна?
Почему просто не воспользоваться стандартной UTF8Decode? Есть кике-то подводные камни? раз есть ещё и такой способ, как ниже.

{Convert string from UTF-8 format into ASCII}
function UTF8ToStr(Value: String): String;
var
 buffer: Pointer;
 BufLen: LongWord;
begin
 BufLen := Length(Value) + 4;
 GetMem(buffer, BufLen);
 FillChar(buffer^, BufLen, 0);
 MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
 Result := WideCharToString(buffer);
 FreeMem(buffer, BufLen);
end;

{Convert string from UTF-8 format mixed with standart ASCII symbols($00..$7f)}
function UTF8ToStrSmart(Value: String): String;
var
 Digit: String;
 i: Word;
 HByte: Byte;
 Len: Byte;
begin
 Result := '';
 Len := 0;
 if Value = '' then Exit;
 for i := 1 to Length(Value) do
 begin
   if Len > 0 then
   begin
     Digit := Digit + Value[i];
     Dec(Len);
     if Len = 0 then
       Result := Result + UTF8ToStr(Digit);
   end else
   begin
     HByte := Ord(Value[i]);
     if HByte in [$00..$7f] then       //Standart ASCII chars
       Result := Result + Value[i]
     else begin
       //Get length of UTF-8 char
       if HByte and $FC = $FC then
         Len := 6
       else if HByte and $F8 = $F8 then
         Len := 5
       else if HByte and $F0 = $F0 then
         Len := 4
       else if HByte and $E0 = $E0 then
         Len := 3
       else if HByte and $C0 = $C0 then
         Len := 2
       else begin
         Result := Result + Value[i];
         Continue;
       end;
       Dec(Len);
       Digit := Value[i];
     end;
   end;
 end;
end;


CyberPunk   (2007-11-11 18:13:00) [1]

Лично у меня UTF8Decode не пахал в проге... отлично заработала UTF8ToStrSmart... Я долго искал что нить подобное этой функции....


tesseract   (2007-08-30 16:42:00) [2]


> Почему просто не воспользоваться стандартной UTF8Decode?
>  Есть кике-то подводные камни? раз есть ещё и такой способ,
>  как ниже.


У кого-то гемморой зарос, решил поправить. Кто тебе сказал, что у клиента стоит именно такая кодировка ?


Vendict   (2007-08-29 13:58:00) [3]

readline();   (28.08.07 17:44)
Почему просто не воспользоваться стандартной UTF8Decode? Есть кике-то подводные камни? раз есть ещё и такой способ, как ниже.


может некоторым не охота нагружать свой ехе-шник лишними бибилиотеками. подводных камней нет, так как я такую же функцию использую на перле, хотя переделывал её из php.


Наверх

Титульная страница Поиск, карта сайта Написать письмо