Сборник аналогов php функций для pascal
 Добавлено: 26.03.2011 13:53:33
Добавлено: 26.03.2011 13:53:33Я создал эту тему, т.к. накопилось большое количество функций аналогов из пхп, они практически все полностью идентичны оригиналам, некоторые довольно сложно найти в интернете, многие написал сам, некоторые переписал с си, некоторые чуть подкорректировал.
Хочется поделиться, все таки чтобы такой труд не пропадал даром, многим думаю пригодится.
Тема будет постоянно пополняться и обновляться. Все функции оптимизированы для быстрого выполнения.
similar_text — Вычисляет степень похожести двух строк по алгоритму, описанному Oliver [1993].
http://php.net/manual/ru/function.similar-text.php
bin2hex — Преобразует бинарные данные в шестнадцатиричное представление
http://php.net/manual/ru/function.bin2hex.php
strstr — Находит первое вхождение подстроки
http://php.net/manual/ru/function.strstr.php
strspn — Возвращает длину участка в начале строки, соответствующего маске
http://php.net/manual/ru/function.strspn.php
Добавлено спустя 5 минут 5 секунд:
strcspn — Возвращает длину участка в начале строки, не соответствующего маске
http://php.net/manual/ru/function.strcspn.php
Добавлено спустя 3 минуты 22 секунды:
Функция WordText из fpc и delphi не соответствует функции из php, она немного другая, поэтому:
wordwrap — Выполняет перенос строки на данное количество символов с использованием символа разрыва строки.
http://php.net/manual/ru/function.wordwrap.php
Добавлено спустя 2 минуты 50 секунд:
strpbrk — Ищет в строке любой символ из заданного набора
http://php.net/manual/ru/function.strpbrk.php
Зависимость от: StrStr
Добавлено спустя 4 минуты 5 секунд:
base_convert — Конвертирует число между разными системами исчисления.
http://php.net/manual/ru/function.base-convert.php
Зависимость от: Math
Добавлено спустя 5 минут 52 секунды:
convert_cyr_string — Преобразует строку из одной кириллической кодировки в другую
http://php.net/manual/ru/function.conve ... string.php
Модуль CyrConvert:
Добавлено спустя 2 часа 10 минут 27 секунд:
Умный аналог Copy из php - substr. Легко может заменить кучу функций для работы со строками.
substr - возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Если start неотрицателен, возвращаемая подстрока начинается в позиции start от начала строки, считая от нуля. Например, в строке 'abcdef', в позиции 0 находится символ 'a', в позиции 2 - символ 'c', и т.д.
http://php.su/functions/?substr
			Хочется поделиться, все таки чтобы такой труд не пропадал даром, многим думаю пригодится.
Тема будет постоянно пополняться и обновляться. Все функции оптимизированы для быстрого выполнения.
similar_text — Вычисляет степень похожести двух строк по алгоритму, описанному Oliver [1993].
http://php.net/manual/ru/function.similar-text.php
- Код: Выделить всё
- procedure similar_str(const txt1,txt2: PAnsiChar; const len1, len2: Integer; var Pos1, Pos2, Max: Integer);
 var
 l: integer;
 end1, end2, p, q: PAnsiChar;
 begin
 end1 := txt1 + len1;
 end2 := txt2 + len2;
 max := 0;
 p := txt1;
 q := txt2;
 while p < end1 do
 begin
 Inc(p);
 while q < end2 do
 begin
 Inc(q);
 l := 0;
 while (p + l < end1) and (q + l < end2) and (p[l] = q[l]) do
 inc(l);
 if l > max then
 begin
 max := l;
 pos1 := p - txt1;
 pos2 := q - txt2;
 end;
 end;
 end;
 end;
 function similar_char(const txt1, txt2: PAnsiChar; const len1, len2: Integer): Integer;
 var
 pos1, pos2, max: Integer;
 begin
 similar_str(txt1, txt2, len1, len2, pos1, pos2, max);
 
 Result := max;
 if Result > 0 then
 begin
 if (Pos1 > 0) and (Pos2 > 0) then
 Inc(Result, similar_char(txt1, txt2, pos1, pos2));
 if (Pos1 + Max < Len1) and (Pos2 + Max < Len2) then
 begin
 Inc(Result, similar_char(txt1 + Pos1 + max, txt2 + Pos2 + max,
 len1 - pos1 - max, len2 - pos2 - max));
 end;
 end;
 end;
 function similar_text(const txt1, txt2: AnsiString; var precent: Double): Integer;
 var
 len1, len2: integer;
 begin
 len1 := length(txt1);
 len2 := length(txt2);
 
 if len1 + len2 > 0 then begin
 Result := similar_char(@txt1[1], @txt2[1], len1, len2);
 precent := (Result * 200) / (len1 + len2);
 end else
 begin
 Result := 0;
 precent := 0;
 end;
bin2hex — Преобразует бинарные данные в шестнадцатиричное представление
http://php.net/manual/ru/function.bin2hex.php
- Код: Выделить всё
- function bin2hex(const Value: AnsiString): AnsiString;
 const
 hexconvtab: AnsiString = '0123456789abcdef';
 var
 i, j, t, len: integer;
 begin
 len := Length(Value);
 
 SetLength(Result, len * 2);
 j := 0;
 for i := 1 to Len do
 begin
 inc(j);
 Result[j] := hexconvtab[(ord(Value[i]) shr 4)+1];
 inc(j);
 Result[j] := hexconvtab[(ord(Value[i]) and 15)+1];
 end;
 end;
strstr — Находит первое вхождение подстроки
http://php.net/manual/ru/function.strstr.php
- Код: Выделить всё
- function StrStr(const S:AnsiString; const Srch:AnsiString):AnsiString;
 var
 k: integer;
 begin
 k := Pos(Srch,S);
 if k > 0 then begin
 Result := s;
 Delete(Result,1,k-1);
 end
 else Result := '';
 end;
strspn — Возвращает длину участка в начале строки, соответствующего маске
http://php.net/manual/ru/function.strspn.php
- Код: Выделить всё
- function StrSpn(const S: AnsiString; const Chars: AnsiString; StartIndex: Integer = 1; Len: Integer = -1): integer;
 var
 i,_to,l: integer;
 begin
 if StartIndex <= 0 then StartIndex := 1;
 l := length(s);
 if (len > -1) then begin
 _to := StartIndex + len;
 if _to > l then _to := l;
 end else _to := l;
 for i:=StartIndex to _to do
 if Pos(S[i],Chars) = 0 then
 begin
 Result := i;
 exit;
 end;
 Result := _to;
 end;
Добавлено спустя 5 минут 5 секунд:
strcspn — Возвращает длину участка в начале строки, не соответствующего маске
http://php.net/manual/ru/function.strcspn.php
- Код: Выделить всё
- function StrCSpn(const S: AnsiString; const Chars: AnsiString; StartIndex: Integer = 1; Len: Integer = -1): integer;
 var
 i,_to,l: integer;
 begin
 if StartIndex <= 0 then StartIndex := 1;
 l := length(s);
 if (len > -1) then begin
 _to := StartIndex + len;
 if _to > l then _to := l;
 end else _to := l;
 for i:=StartIndex to _to do
 if Pos(S[i],Chars) > 0 then
 begin
 Result := i;
 exit;
 end;
 Result := _to;
 end;
Добавлено спустя 3 минуты 22 секунды:
Функция WordText из fpc и delphi не соответствует функции из php, она немного другая, поэтому:
wordwrap — Выполняет перенос строки на данное количество символов с использованием символа разрыва строки.
http://php.net/manual/ru/function.wordwrap.php
- Код: Выделить всё
- function WrapText(const Line, BreakStr: Ansistring; const BreakChars: TSysCharSet;
 MaxCol: Integer): string;
 const
 QuoteChars = ['''', '"'];
 {$ifdef fpc}
 function CharLength(const S: ansistring; Index: Integer): Integer;
 begin
 Result := 1;
 assert((Index > 0) and (Index <= Length(S)));
 if SysLocale.FarEast and (S[Index] in LeadBytes) then
 Result := StrCharLength(PAnsiChar(S) + Index - 1);
 end;
 {$endif}
 var
 Col, Pos: Integer;
 LinePos, LineLen: Integer;
 BreakLen, BreakPos: Integer;
 QuoteChar, CurChar: AnsiChar;
 ExistingBreak: Boolean;
 L: Integer;
 begin
 Col := 1;
 Pos := 1;
 LinePos := 1;
 BreakPos := 0;
 QuoteChar := #0;
 ExistingBreak := False;
 LineLen := Length(Line);
 BreakLen := Length(BreakStr);
 Result := '';
 while Pos <= LineLen do
 begin
 CurChar := Line[Pos];
 if CurChar in LeadBytes then
 begin
 L := CharLength(Line, Pos) - 1;
 Inc(Pos, L);
 Inc(Col, L);
 end
 else
 begin
 if CurChar in QuoteChars then
 if QuoteChar = #0 then
 QuoteChar := CurChar
 else if CurChar = QuoteChar then
 QuoteChar := #0;
 if QuoteChar = #0 then
 begin
 if CurChar = BreakStr[1] then
 begin
 ExistingBreak := StrLComp(PAnsiChar(BreakStr), PAnsiChar(@Line[Pos]), BreakLen) = 0;
 if ExistingBreak then
 begin
 Inc(Pos, BreakLen-1);
 BreakPos := Pos;
 end;
 end;
 if not ExistingBreak then
 if CurChar in BreakChars then
 BreakPos := Pos;
 end;
 end;
 Inc(Pos);
 Inc(Col);
 if not (QuoteChar in QuoteChars) and (ExistingBreak or
 ((Col > MaxCol) and (BreakPos > LinePos))) then
 begin
 Col := 1;
 //Result := Result + Copy(Line, LinePos, BreakPos - LinePos + 1);
 Result := Result + Copy(Line, LinePos, BreakPos - LinePos);
 if not (CurChar in QuoteChars) then
 begin
 while Pos <= LineLen do
 begin
 if Line[Pos] in BreakChars then
 begin
 Inc(Pos);
 ExistingBreak := False;
 end
 else
 begin
 if StrLComp(pAnsiChar(@Line[Pos]), sLineBreak, Length(sLineBreak)) = 0 then
 begin
 Inc(Pos, Length(sLineBreak));
 ExistingBreak := True;
 end
 else
 Break;
 end;
 end;
 end;
 if (Pos <= LineLen) and not ExistingBreak then
 Result := Result + BreakStr;
 Inc(BreakPos);
 LinePos := BreakPos;
 Pos := LinePos;
 ExistingBreak := False;
 end;
 end;
 Result := Result + Copy(Line, LinePos, MaxInt);
 end;
 function WordWrap(const S: AnsiString; const Width: Integer = 75;
 const Break: AnsiString = #13; const Cut: Boolean = false): AnsiString;
 begin
 if Cut then
 Result := WrapText(S,Break,[' '],Width+1) // todo fix Cut Param
 else
 Result := WrapText(S,Break,[' '],Width+1);
 end;
Добавлено спустя 2 минуты 50 секунд:
strpbrk — Ищет в строке любой символ из заданного набора
http://php.net/manual/ru/function.strpbrk.php
Зависимость от: StrStr
- Код: Выделить всё
- function StrPbrk(const s1, s2: AnsiString): AnsiString;
 var
 i,len: integer;
 begin
 Result := #0;
 len := length(s1);
 for i := 1 to len do
 if StrStr(s2,s1[i]) <> '' then
 begin
 Result := s1;
 Delete(Result,1,i-1);
 exit;
 end;
 end;
Добавлено спустя 4 минуты 5 секунд:
base_convert — Конвертирует число между разными системами исчисления.
http://php.net/manual/ru/function.base-convert.php
Зависимость от: Math
- Код: Выделить всё
- function base_convert(NumIn: AnsiString; BaseIn: Byte; BaseOut: Byte): AnsiString;
 var
 i: integer;
 currentCharacter: AnsiChar;
 CharacterValue: Integer;
 PlaceValue: Integer;
 RunningTotal: Double;
 Remainder: Double;
 BaseOutDouble: Double;
 NumInCaps: AnsiString;
 s: AnsiString;
 begin
 if (NumIn = '') or (BaseIn < 2) or (BaseIn > 36) or (BaseOut < 1) or (BaseOut
 > 36) then
 begin
 Result := '';
 Exit;
 end;
 NumInCaps := UpperCase(NumIn);
 PlaceValue := Length(NumInCaps);
 RunningTotal := 0;
 for i := 1 to Length(NumInCaps) do
 begin
 PlaceValue := PlaceValue - 1;
 CurrentCharacter := NumInCaps[i];
 CharacterValue := 0;
 if (Ord(CurrentCharacter) > 64) and (Ord(CurrentCharacter) < 91) then
 CharacterValue := Ord(CurrentCharacter) - 55;
 if CharacterValue = 0 then
 if (Ord(CurrentCharacter) < 48) or (Ord(CurrentCharacter) > 57) then
 begin
 Result := '';
 Exit;
 end
 else
 CharacterValue := Ord(CurrentCharacter) - 48;
 if (CharacterValue < 0) or (CharacterValue > BaseIn - 1) then
 begin
 Result := '';
 Exit;
 end;
 RunningTotal := RunningTotal + CharacterValue * (Power(BaseIn, PlaceValue));
 end;
 while RunningTotal > 0 do
 begin
 BaseOutDouble := BaseOut;
 Remainder := RunningTotal - (int(RunningTotal / BaseOutDouble) *
 BaseOutDouble);
 RunningTotal := (RunningTotal - Remainder) / BaseOut;
 if Remainder >= 10 then
 CurrentCharacter := AnsiChar(Trunc(Remainder + 55))
 else
 begin
 s := IntToStr(trunc(remainder));
 CurrentCharacter := s[Length(s)];
 end;
 Result := CurrentCharacter + Result;
 end;
 end;
Добавлено спустя 5 минут 52 секунды:
convert_cyr_string — Преобразует строку из одной кириллической кодировки в другую
http://php.net/manual/ru/function.conve ... string.php
Модуль CyrConvert:
- Код: Выделить всё
- unit CyrConvert;
 
 
 {$ifdef fpc}{$mode delphi}{$endif}
 {$H+}
 
 interface
 
 uses
 SysUtils;
 
 function convert_cyr_string(const str : AnsiString; const from, to_ : AnsiChar) : AnsiString;
 
 
 implementation
 
 const
 cyr_win1251 = 0;
 cyr_cp866 = 1;
 cyr_iso88595 = 2;
 cyr_mac = 3;
 
 var
 CYR_TABLES: Array[0..3] of Array[0..511] of AnsiChar = (
 
 // WIN-1251
 (#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,
 #46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,#46,
 #154,#174,#190,#46,#159,#189,#46,#46,#179,#191,#180,#157,#46,#46,#156,#183,
 #46,#46,#182,#166,#173,#46,#46,#158,#163,#152,#164,#155,#46,#46,#46,#167,
 #225,#226,#247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,#238,#239,#240,
 #242,#243,#244,#245,#230,#232,#227,#254,#251,#253,#255,#249,#248,#252,#224,#241,
 #193,#194,#215,#199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,#207,#208,
 #210,#211,#212,#213,#198,#200,#195,#222,#219,#221,#223,#217,#216,#220,#192,#209,
 #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#184,#186,#32,#179,#191,#32,#32,#32,#32,#32,#180,#162,#32,
 #32,#32,#32,#168,#170,#32,#178,#175,#32,#32,#32,#32,#32,#165,#161,#169,
 #254,#224,#225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,#236,#237,#238,
 #239,#255,#240,#241,#242,#243,#230,#226,#252,#251,#231,#248,#253,#249,#247,#250,
 #222,#192,#193,#214,#196,#197,#212,#195,#213,#200,#201,#202,#203,#204,#205,#206,
 #207,#223,#208,#209,#210,#211,#198,#194,#220,#219,#199,#216,#221,#217,#215,#218),
 
 // CP 866
 (#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #225,#226,#247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,#238,#239,#240,
 #242,#243,#244,#245,#230,#232,#227,#254,#251,#253,#255,#249,#248,#252,#224,#241,
 #193,#194,#215,#199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,#207,#208,
 #35,#35,#35,#124,#124,#124,#124,#43,#43,#124,#124,#43,#43,#43,#43,#43,
 #43,#45,#45,#124,#45,#43,#124,#124,#43,#43,#45,#45,#124,#45,#43,#45,
 #45,#45,#45,#43,#43,#43,#43,#43,#43,#43,#43,#35,#35,#124,#124,#35,
 #210,#211,#212,#213,#198,#200,#195,#222,#219,#221,#223,#217,#216,#220,#192,#209,
 #179,#163,#180,#164,#183,#167,#190,#174,#32,#149,#158,#32,#152,#159,#148,#154,
 #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #205,#186,#213,#241,#243,#201,#32,#245,#187,#212,#211,#200,#190,#32,#247,#198,
 #199,#204,#181,#240,#242,#185,#32,#244,#203,#207,#208,#202,#216,#32,#246,#32,
 #238,#160,#161,#230,#164,#165,#228,#163,#229,#168,#169,#170,#171,#172,#173,#174,
 #175,#239,#224,#225,#226,#227,#166,#162,#236,#235,#167,#232,#237,#233,#231,#234,
 #158,#128,#129,#150,#132,#133,#148,#131,#149,#136,#137,#138,#139,#140,#141,#142,
 #143,#159,#144,#145,#146,#147,#134,#130,#156,#155,#135,#152,#157,#153,#151,#154),
 
 // iso88595
 (#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#179,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #225,#226,#247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,#238,#239,#240,
 #242,#243,#244,#245,#230,#232,#227,#254,#251,#253,#255,#249,#248,#252,#224,#241,
 #193,#194,#215,#199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,#207,#208,
 #210,#211,#212,#213,#198,#200,#195,#222,#219,#221,#223,#217,#216,#220,#192,#209,
 #32,#163,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#241,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #32,#32,#32,#161,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,#32,
 #238,#208,#209,#230,#212,#213,#228,#211,#229,#216,#217,#218,#219,#220,#221,#222,
 #223,#239,#224,#225,#226,#227,#214,#210,#236,#235,#215,#232,#237,#233,#231,#234,
 #206,#176,#177,#198,#180,#181,#196,#179,#197,#184,#185,#186,#187,#188,#189,#190,
 #191,#207,#192,#193,#194,#195,#182,#178,#204,#203,#183,#200,#205,#201,#199,#202),
 
 // Mac
 (#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #225,#226,#247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,#238,#239,#240,
 #242,#243,#244,#245,#230,#232,#227,#254,#251,#253,#255,#249,#248,#252,#224,#241,
 #160,#161,#162,#163,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174,#175,
 #176,#177,#178,#179,#180,#181,#182,#183,#184,#185,#186,#187,#188,#189,#190,#191,
 #128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,#140,#141,#142,#143,
 #144,#145,#146,#147,#148,#149,#150,#151,#152,#153,#154,#155,#156,#179,#163,#209,
 #193,#194,#215,#199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,#207,#208,
 #210,#211,#212,#213,#198,#200,#195,#222,#219,#221,#223,#217,#216,#220,#192,#255,
 #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,
 #16,#17,#18,#19,#20,#21,#22,#23,#24,#25,#26,#27,#28,#29,#30,#31,
 #32,#33,#34,#35,#36,#37,#38,#39,#40,#41,#42,#43,#44,#45,#46,#47,
 #48,#49,#50,#51,#52,#53,#54,#55,#56,#57,#58,#59,#60,#61,#62,#63,
 #64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,#79,
 #80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
 #96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,
 #112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,#126,#127,
 #192,#193,#194,#195,#196,#197,#198,#199,#200,#201,#202,#203,#204,#205,#206,#207,
 #208,#209,#210,#211,#212,#213,#214,#215,#216,#217,#218,#219,#220,#221,#222,#223,
 #160,#161,#162,#222,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174,#175,
 #176,#177,#178,#221,#180,#181,#182,#183,#184,#185,#186,#187,#188,#189,#190,#191,
 #254,#224,#225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,#236,#237,#238,
 #239,#223,#240,#241,#242,#243,#230,#226,#252,#251,#231,#248,#253,#249,#247,#250,
 #158,#128,#129,#150,#132,#133,#148,#131,#149,#136,#137,#138,#139,#140,#141,#142,
 #143,#159,#144,#145,#146,#147,#134,#130,#156,#155,#135,#152,#157,#153,#151,#154)
 );
 
 
 function convert_cyr_string(const str : AnsiString; const from, to_ : AnsiChar) : AnsiString;
 var
 iFrom,iTo: Shortint;
 i, len: Integer;
 tmp: AnsiChar;
 begin
 iFrom := -1;
 iTo := -1;
 Result := '';
 
 case UpCase(from) of
 'W': iFrom := cyr_win1251; //
 'A','D': iFrom := cyr_cp866;
 'I': iFrom := cyr_iso88595;
 'M': iFrom := cyr_mac;
 'K': ;
 else
 exit;
 end;
 
 case UpCase(to_) of
 'W': iTo := cyr_win1251; //
 'A','D': iTo := cyr_cp866;
 'I': iTo := cyr_iso88595;
 'M': iTo := cyr_mac;
 'K': ;
 else
 exit;
 end;
 
 len := Length(str);
 SetLength(Result, len);
 
 for i := 1 to len do
 begin
 if iFrom = -1 then
 tmp := str[i]
 else
 tmp := CYR_TABLES[iFrom][ ord(str[i]) ];
 
 if iTo = -1 then
 Result[i] := tmp
 else
 Result[i] := CYR_TABLES[iTo][ ord(tmp) + 256 ];
 end;
 end;
Добавлено спустя 2 часа 10 минут 27 секунд:
Умный аналог Copy из php - substr. Легко может заменить кучу функций для работы со строками.
substr - возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Если start неотрицателен, возвращаемая подстрока начинается в позиции start от начала строки, считая от нуля. Например, в строке 'abcdef', в позиции 0 находится символ 'a', в позиции 2 - символ 'c', и т.д.
http://php.su/functions/?substr
- Код: Выделить всё
- function substr(const S: AnsiString; From, Len: Integer): AnsiString; overload;
 var
 i, input_len: integer;
 begin
 input_len := Length(S);
 
 if from < 0 then
 inc(from, input_len);
 if len < 0 then
 begin
 Len := (input_len + Len) - from;
 if Len < 1 then
 begin
 Result := '';
 exit;
 end;
 end;
 Result := Copy(S, from+1, Len);
 end;
 function substr(const S: AnsiString; From: Integer): AnsiString; overload;
 begin
 Result := substr(S, From, Length(S) - abs(from));
 end;