Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

UTF8toAnsi   Найти похожие ветки 

 
Spectrum2   (2006-08-07 23:24) [0]

подскажите текст функции, в Делфи 5 ее нет, но появилась в новых,
искать Д6-8 пока нет возможности


 
Мефисто   (2006-08-07 23:32) [1]

// UnicodeToUTF8(3):
// Scans the source data to find the null terminator, up to MaxBytes
// Dest must have MaxBytes available in Dest.

function UnicodeToUtf8(Dest: PChar; Source: PWideChar; MaxBytes: Integer): Integer;
var
 len: Cardinal;
begin
 len := 0;
 if Source <> nil then
   while Source[len] <> #0 do
     Inc(len);
 Result := UnicodeToUtf8(Dest, MaxBytes, Source, len);
end;

// UnicodeToUtf8(4):
// MaxDestBytes includes the null terminator (last char in the buffer will be set to null)
// Function result includes the null terminator.
// Nulls in the source data are not considered terminators - SourceChars must be accurate

function UnicodeToUtf8(Dest: PChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal;
var
 i, count: Cardinal;
 c: Cardinal;
begin
 Result := 0;
 if Source = nil then Exit;
 count := 0;
 i := 0;
 if Dest <> nil then
 begin
   while (i < SourceChars) and (count < MaxDestBytes) do
   begin
     c := Cardinal(Source[i]);
     Inc(i);
     if c <= $7F then
     begin
       Dest[count] := Char(c);
       Inc(count);
     end
     else if c > $7FF then
     begin
       if count + 3 > MaxDestBytes then
         break;
       Dest[count] := Char($E0 or (c shr 12));
       Dest[count+1] := Char($80 or ((c shr 6) and $3F));
       Dest[count+2] := Char($80 or (c and $3F));
       Inc(count,3);
     end
     else //  $7F < Source[i] <= $7FF
     begin
       if count + 2 > MaxDestBytes then
         break;
       Dest[count] := Char($C0 or (c shr 6));
       Dest[count+1] := Char($80 or (c and $3F));
       Inc(count,2);
     end;
   end;
   if count >= MaxDestBytes then count := MaxDestBytes-1;
   Dest[count] := #0;
 end
 else
 begin
   while i < SourceChars do
   begin
     c := Integer(Source[i]);
     Inc(i);
     if c > $7F then
     begin
       if c > $7FF then
         Inc(count);
       Inc(count);
     end;
     Inc(count);
   end;
 end;
 Result := count+1;  // convert zero based index to byte count
end;

function Utf8ToUnicode(Dest: PWideChar; Source: PChar; MaxChars: Integer): Integer;
var
 len: Cardinal;
begin
 len := 0;
 if Source <> nil then
   while Source[len] <> #0 do
     Inc(len);
 Result := Utf8ToUnicode(Dest, MaxChars, Source, len);
end;

function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: Cardinal; Source: PChar; SourceBytes: Cardinal): Cardinal;
var
 i, count: Cardinal;
 c: Byte;
 wc: Cardinal;
begin
 if Source = nil then
 begin
   Result := 0;
   Exit;
 end;
 Result := Cardinal(-1);
 count := 0;
 i := 0;
 if Dest <> nil then
 begin
   while (i < SourceBytes) and (count < MaxDestChars) do
   begin
     wc := Cardinal(Source[i]);
     Inc(i);
     if (wc and $80) <> 0 then
     begin
       if i >= SourceBytes then Exit;          // incomplete multibyte char
       wc := wc and $3F;
       if (wc and $20) <> 0 then
       begin
         c := Byte(Source[i]);
         Inc(i);
         if (c and $C0) <> $80 then Exit;      // malformed trail byte or out of range char
         if i >= SourceBytes then Exit;        // incomplete multibyte char
         wc := (wc shl 6) or (c and $3F);
       end;
       c := Byte(Source[i]);
       Inc(i);
       if (c and $C0) <> $80 then Exit;       // malformed trail byte

       Dest[count] := WideChar((wc shl 6) or (c and $3F));
     end
     else
       Dest[count] := WideChar(wc);
     Inc(count);
   end;
   if count >= MaxDestChars then count := MaxDestChars-1;
   Dest[count] := #0;
 end
 else
 begin
   while (i < SourceBytes) do
   begin
     c := Byte(Source[i]);
     Inc(i);
     if (c and $80) <> 0 then
     begin
       if i >= SourceBytes then Exit;          // incomplete multibyte char
       c := c and $3F;
       if (c and $20) <> 0 then
       begin
         c := Byte(Source[i]);
         Inc(i);
         if (c and $C0) <> $80 then Exit;      // malformed trail byte or out of range char
         if i >= SourceBytes then Exit;        // incomplete multibyte char
       end;
       c := Byte(Source[i]);
       Inc(i);
       if (c and $C0) <> $80 then Exit;       // malformed trail byte
     end;
     Inc(count);
   end;
 end;
 Result := count+1;
end;

function Utf8Encode(const WS: WideString): UTF8String;
var
 L: Integer;
 Temp: UTF8String;
begin
 Result := "";
 if WS = "" then Exit;
 SetLength(Temp, Length(WS) * 3); // SetLength includes space for null terminator

 L := UnicodeToUtf8(PChar(Temp), Length(Temp)+1, PWideChar(WS), Length(WS));
 if L > 0 then
   SetLength(Temp, L-1)
 else
   Temp := "";
 Result := Temp;
end;

function Utf8Decode(const S: UTF8String): WideString;
var
 L: Integer;
 Temp: WideString;
begin
 Result := "";
 if S = "" then Exit;
 SetLength(Temp, Length(S));

 L := Utf8ToUnicode(PWideChar(Temp), Length(Temp)+1, PChar(S), Length(S));
 if L > 0 then
   SetLength(Temp, L-1)
 else
   Temp := "";
 Result := Temp;
end;

function AnsiToUtf8(const S: string): UTF8String;
begin
 Result := Utf8Encode(S);
end;

function Utf8ToAnsi(const S: UTF8String): string;
begin
 Result := Utf8Decode(S);
end;


 
Мефисто   (2006-08-07 23:34) [2]

UTF8String = type string;
 PUTF8String = ^UTF8String;


 
Spectrum2   (2006-08-09 00:56) [3]

спасибо!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.076 c
15-1154259582
antonn
2006-07-30 15:39
2006.08.27
вопросик по ява-скрипту


3-1150701631
Jann
2006-06-19 11:20
2006.08.27
связь с MS SQL Server


15-1150301630
Gero
2006-06-14 20:13
2006.08.27
DMClient 3 beta_1.2 — новая версия клиента для этого форума


2-1155058414
Bober
2006-08-08 21:33
2006.08.27
GetFileSize


1-1152971168
Vendict
2006-07-15 17:46
2006.08.27
Потомок TFileStream





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский