LConvEncoding refactoring. Issue #28093, patch from Alexey Torgashin.

git-svn-id: trunk@49045 -
This commit is contained in:
juha 2015-05-16 11:09:15 +00:00
parent 692ca6bd8b
commit ed5a6cac42

View File

@ -20,12 +20,44 @@ interface
uses
SysUtils, Classes, dos, LazUTF8
{$IFDEF EnableIconvEnc},iconvenc{$ENDIF};
//encoding names
const
EncodingUTF8 = 'utf8';
EncodingAnsi = 'ansi';
EncodingUTF8BOM = 'utf8bom'; // UTF-8 with byte order mark
EncodingUCS2LE = 'ucs2le'; // UCS 2 byte little endian
EncodingUCS2BE = 'ucs2be'; // UCS 2 byte big endian
EncodingCP1250 = 'cp1250';
EncodingCP1251 = 'cp1251';
EncodingCP1252 = 'cp1252';
EncodingCP1253 = 'cp1253';
EncodingCP1254 = 'cp1254';
EncodingCP1255 = 'cp1255';
EncodingCP1256 = 'cp1256';
EncodingCP1257 = 'cp1257';
EncodingCP1258 = 'cp1258';
EncodingCP437 = 'cp437';
EncodingCP850 = 'cp850';
EncodingCP852 = 'cp852';
EncodingCP866 = 'cp866';
EncodingCP874 = 'cp874';
EncodingCP932 = 'cp932';
EncodingCP936 = 'cp936';
EncodingCP949 = 'cp949';
EncodingCP950 = 'cp950';
EncodingCPMac = 'macintosh';
EncodingCPKOI8 = 'koi8';
EncodingCPIso1 = 'iso88591';
EncodingCPIso15 = 'iso885915';
EncodingCPIso2 = 'iso88592';
//signatures in ansi
const
UTF8BOM = #$EF#$BB#$BF;
UTF16BEBOM = #$FE#$FF;
UTF16LEBOM = #$FF#$FE;
@ -6897,27 +6929,28 @@ begin
List.Add('UTF-8');
List.Add('UTF-8BOM');
List.Add('Ansi');
List.Add('CP1250');
List.Add('CP1251');
List.Add('CP1252');
List.Add('CP1253');
List.Add('CP1254');
List.Add('CP1255');
List.Add('CP1256');
List.Add('CP1257');
List.Add('CP1258');
List.Add('CP437');
List.Add('CP850');
List.Add('CP852');
List.Add('CP866');
List.Add('CP874');
List.Add(UpperCase(EncodingCP1250));
List.Add(UpperCase(EncodingCP1251));
List.Add(UpperCase(EncodingCP1252));
List.Add(UpperCase(EncodingCP1253));
List.Add(UpperCase(EncodingCP1254));
List.Add(UpperCase(EncodingCP1255));
List.Add(UpperCase(EncodingCP1256));
List.Add(UpperCase(EncodingCP1257));
List.Add(UpperCase(EncodingCP1258));
List.Add(UpperCase(EncodingCP437));
List.Add(UpperCase(EncodingCP850));
List.Add(UpperCase(EncodingCP852));
List.Add(UpperCase(EncodingCP866));
List.Add(UpperCase(EncodingCP874));
{$IFNDEF DisableAsianCodePages}
// asian
List.Add('CP932');
List.Add('CP936');
List.Add('CP949');
List.Add('CP950');
List.Add(UpperCase(EncodingCP932));
List.Add(UpperCase(EncodingCP936));
List.Add(UpperCase(EncodingCP949));
List.Add(UpperCase(EncodingCP950));
{$ENDIF}
List.Add('ISO-8859-1');
@ -7083,31 +7116,31 @@ begin
if (AFrom=EncodingUTF8) then begin
if ATo=EncodingUTF8BOM then begin Result:=UTF8ToUTF8BOM(s); exit; end;
if ATo='iso88591' then begin Result:=UTF8ToISO_8859_1(s); exit; end;
if ATo='iso885915' then begin Result:=UTF8ToISO_8859_15(s); exit; end;
if ATo='iso88592' then begin Result:=UTF8ToISO_8859_2(s); exit; end;
if ATo='cp1250' then begin Result:=UTF8ToCP1250(s); exit; end;
if ATo='cp1251' then begin Result:=UTF8ToCP1251(s); exit; end;
if ATo='cp1252' then begin Result:=UTF8ToCP1252(s); exit; end;
if ATo='cp1253' then begin Result:=UTF8ToCP1253(s); exit; end;
if ATo='cp1254' then begin Result:=UTF8ToCP1254(s); exit; end;
if ATo='cp1255' then begin Result:=UTF8ToCP1255(s); exit; end;
if ATo='cp1256' then begin Result:=UTF8ToCP1256(s); exit; end;
if ATo='cp1257' then begin Result:=UTF8ToCP1257(s); exit; end;
if ATo='cp1258' then begin Result:=UTF8ToCP1258(s); exit; end;
if ATo='cp437' then begin Result:=UTF8ToCP437(s); exit; end;
if ATo='cp850' then begin Result:=UTF8ToCP850(s); exit; end;
if ATo='cp852' then begin Result:=UTF8ToCP852(s); exit; end;
if ATo='cp866' then begin Result:=UTF8ToCP866(s); exit; end;
if ATo='cp874' then begin Result:=UTF8ToCP874(s); exit; end;
if ATo=EncodingCPIso1 then begin Result:=UTF8ToISO_8859_1(s); exit; end;
if ATo=EncodingCPIso15 then begin Result:=UTF8ToISO_8859_15(s); exit; end;
if ATo=EncodingCPIso2 then begin Result:=UTF8ToISO_8859_2(s); exit; end;
if ATo=EncodingCP1250 then begin Result:=UTF8ToCP1250(s); exit; end;
if ATo=EncodingCP1251 then begin Result:=UTF8ToCP1251(s); exit; end;
if ATo=EncodingCP1252 then begin Result:=UTF8ToCP1252(s); exit; end;
if ATo=EncodingCP1253 then begin Result:=UTF8ToCP1253(s); exit; end;
if ATo=EncodingCP1254 then begin Result:=UTF8ToCP1254(s); exit; end;
if ATo=EncodingCP1255 then begin Result:=UTF8ToCP1255(s); exit; end;
if ATo=EncodingCP1256 then begin Result:=UTF8ToCP1256(s); exit; end;
if ATo=EncodingCP1257 then begin Result:=UTF8ToCP1257(s); exit; end;
if ATo=EncodingCP1258 then begin Result:=UTF8ToCP1258(s); exit; end;
if ATo=EncodingCP437 then begin Result:=UTF8ToCP437(s); exit; end;
if ATo=EncodingCP850 then begin Result:=UTF8ToCP850(s); exit; end;
if ATo=EncodingCP852 then begin Result:=UTF8ToCP852(s); exit; end;
if ATo=EncodingCP866 then begin Result:=UTF8ToCP866(s); exit; end;
if ATo=EncodingCP874 then begin Result:=UTF8ToCP874(s); exit; end;
{$IFNDEF DisableAsianCodePages}
if ATo='cp936' then begin Result := UTF8ToCP936(s); exit; end;
if ATo='cp950' then begin Result := UTF8ToCP950(s); exit; end;
if ATo='cp949' then begin Result := UTF8ToCP949(s); exit; end;
if ATo='cp932' then begin Result := UTF8ToCP932(s); exit; end;
if ATo=EncodingCP936 then begin Result := UTF8ToCP936(s); exit; end;
if ATo=EncodingCP950 then begin Result := UTF8ToCP950(s); exit; end;
if ATo=EncodingCP949 then begin Result := UTF8ToCP949(s); exit; end;
if ATo=EncodingCP932 then begin Result := UTF8ToCP932(s); exit; end;
{$ENDIF}
if ATo='koi8' then begin Result:=UTF8ToKOI8(s); exit; end;
if ATo='macintosh' then begin Result:=UTF8ToMacintosh(s); exit; end;
if ATo=EncodingCPKOI8 then begin Result:=UTF8ToKOI8(s); exit; end;
if ATo=EncodingCPMac then begin Result:=UTF8ToMacintosh(s); exit; end;
if ATo=EncodingUCS2LE then begin Result:=UTF8ToUCS2LE(s); exit; end;
if ATo=EncodingUCS2BE then begin Result:=UTF8ToUCS2BE(s); exit; end;
@ -7117,31 +7150,31 @@ begin
end;
end else if ATo=EncodingUTF8 then begin
if AFrom=EncodingUTF8BOM then begin Result:=UTF8BOMToUTF8(s); exit; end;
if AFrom='iso88591' then begin Result:=ISO_8859_1ToUTF8(s); exit; end;
if AFrom='iso885915' then begin Result:=ISO_8859_15ToUTF8(s); exit; end;
if AFrom='iso88592' then begin Result:=ISO_8859_2ToUTF8(s); exit; end;
if AFrom='cp1250' then begin Result:=CP1250ToUTF8(s); exit; end;
if AFrom='cp1251' then begin Result:=CP1251ToUTF8(s); exit; end;
if AFrom='cp1252' then begin Result:=CP1252ToUTF8(s); exit; end;
if AFrom='cp1253' then begin Result:=CP1253ToUTF8(s); exit; end;
if AFrom='cp1254' then begin Result:=CP1254ToUTF8(s); exit; end;
if AFrom='cp1255' then begin Result:=CP1255ToUTF8(s); exit; end;
if AFrom='cp1256' then begin Result:=CP1256ToUTF8(s); exit; end;
if AFrom='cp1257' then begin Result:=CP1257ToUTF8(s); exit; end;
if AFrom='cp1258' then begin Result:=CP1258ToUTF8(s); exit; end;
if AFrom='cp437' then begin Result:=CP437ToUTF8(s); exit; end;
if AFrom='cp850' then begin Result:=CP850ToUTF8(s); exit; end;
if AFrom='cp852' then begin Result:=CP852ToUTF8(s); exit; end;
if AFrom='cp866' then begin Result:=CP866ToUTF8(s); exit; end;
if AFrom='cp874' then begin Result:=CP874ToUTF8(s); exit; end;
if AFrom=EncodingCPIso1 then begin Result:=ISO_8859_1ToUTF8(s); exit; end;
if AFrom=EncodingCPIso15 then begin Result:=ISO_8859_15ToUTF8(s); exit; end;
if AFrom=EncodingCPIso2 then begin Result:=ISO_8859_2ToUTF8(s); exit; end;
if AFrom=EncodingCP1250 then begin Result:=CP1250ToUTF8(s); exit; end;
if AFrom=EncodingCP1251 then begin Result:=CP1251ToUTF8(s); exit; end;
if AFrom=EncodingCP1252 then begin Result:=CP1252ToUTF8(s); exit; end;
if AFrom=EncodingCP1253 then begin Result:=CP1253ToUTF8(s); exit; end;
if AFrom=EncodingCP1254 then begin Result:=CP1254ToUTF8(s); exit; end;
if AFrom=EncodingCP1255 then begin Result:=CP1255ToUTF8(s); exit; end;
if AFrom=EncodingCP1256 then begin Result:=CP1256ToUTF8(s); exit; end;
if AFrom=EncodingCP1257 then begin Result:=CP1257ToUTF8(s); exit; end;
if AFrom=EncodingCP1258 then begin Result:=CP1258ToUTF8(s); exit; end;
if AFrom=EncodingCP437 then begin Result:=CP437ToUTF8(s); exit; end;
if AFrom=EncodingCP850 then begin Result:=CP850ToUTF8(s); exit; end;
if AFrom=EncodingCP852 then begin Result:=CP852ToUTF8(s); exit; end;
if AFrom=EncodingCP866 then begin Result:=CP866ToUTF8(s); exit; end;
if AFrom=EncodingCP874 then begin Result:=CP874ToUTF8(s); exit; end;
{$IFNDEF DisableAsianCodePages}
if AFrom='cp936' then begin Result := CP936ToUTF8(s); exit; end;
if AFrom='cp950' then begin Result := CP950ToUTF8(s); exit; end;
if AFrom='cp949' then begin Result := CP949ToUTF8(s); exit; end;
if AFrom='cp932' then begin Result := CP932ToUTF8(s); exit; end;
if AFrom=EncodingCP936 then begin Result := CP936ToUTF8(s); exit; end;
if AFrom=EncodingCP950 then begin Result := CP950ToUTF8(s); exit; end;
if AFrom=EncodingCP949 then begin Result := CP949ToUTF8(s); exit; end;
if AFrom=EncodingCP932 then begin Result := CP932ToUTF8(s); exit; end;
{$ENDIF}
if AFrom='koi8' then begin Result:=KOI8ToUTF8(s); exit; end;
if AFrom='macintosh' then begin Result:=MacintoshToUTF8(s); exit; end;
if AFrom=EncodingCPKOI8 then begin Result:=KOI8ToUTF8(s); exit; end;
if AFrom=EncodingCPMac then begin Result:=MacintoshToUTF8(s); exit; end;
if AFrom=EncodingUCS2LE then begin Result:=UCS2LEToUTF8(s); exit; end;
if AFrom=EncodingUCS2BE then begin Result:=UCS2BEToUTF8(s); exit; end;
@ -7156,93 +7189,93 @@ begin
Encoded := false;
//ANSI->UTF8
if AFrom='iso88591' then begin
if AFrom=EncodingCPIso1 then begin
Result:=ISO_8859_1ToUTF8(s);
Encoded := true;
end
else if AFrom='iso885915' then begin
else if AFrom=EncodingCPIso15 then begin
Result:=ISO_8859_15ToUTF8(s);
Encoded := true;
end
else if AFrom='iso88592' then begin
else if AFrom=EncodingCPIso2 then begin
Result:=ISO_8859_2ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1250' then begin
else if AFrom=EncodingCP1250 then begin
Result:=CP1250ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1251' then begin
else if AFrom=EncodingCP1251 then begin
Result:=CP1251ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1252' then begin
else if AFrom=EncodingCP1252 then begin
Result:=CP1252ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1253' then begin
else if AFrom=EncodingCP1253 then begin
Result:=CP1253ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1254' then begin
else if AFrom=EncodingCP1254 then begin
Result:=CP1254ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1255' then begin
else if AFrom=EncodingCP1255 then begin
Result:=CP1255ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1256' then begin
else if AFrom=EncodingCP1256 then begin
Result:=CP1256ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1257' then begin
else if AFrom=EncodingCP1257 then begin
Result:=CP1257ToUTF8(s);
Encoded := true;
end
else if AFrom='cp1258' then begin
else if AFrom=EncodingCP1258 then begin
Result:=CP1258ToUTF8(s);
Encoded := true;
end
else if AFrom='cp850' then begin
else if AFrom=EncodingCP850 then begin
Result:=CP850ToUTF8(s);
Encoded := true;
end
else if AFrom='cp852' then begin
else if AFrom=EncodingCP852 then begin
Result:=CP852ToUTF8(s);
Encoded := true;
end
else if AFrom='cp866' then begin
else if AFrom=EncodingCP866 then begin
Result:=CP866ToUTF8(s);
Encoded := true;
end
else if AFrom='cp874' then begin
else if AFrom=EncodingCP874 then begin
Result:=CP874ToUTF8(s);
Encoded := true;
end
{$IFNDEF DisableAsianCodePages}
else if AFrom = 'cp936' then
else if AFrom = EncodingCP936 then
begin
Result := CP936ToUTF8(s);
Encoded := True;
end
else if AFrom = 'cp950' then
else if AFrom = EncodingCP950 then
begin
Result := CP950ToUTF8(s);
Encoded := True;
end
else if AFrom = 'cp949' then
else if AFrom = EncodingCP949 then
begin
Result := CP949ToUTF8(s);
Encoded := True;
end
else if AFrom = 'cp932' then
else if AFrom = EncodingCP932 then
begin
Result := CP932ToUTF8(s);
Encoded := True;
end
{$ENDIF}
else if AFrom='koi8' then begin
else if AFrom=EncodingCPKOI8 then begin
Result:=KOI8ToUTF8(s);
Encoded := true;
end
@ -7262,93 +7295,93 @@ begin
if Encoded = true then begin
//UTF8->ANSI
Encoded := false;
if ATo='iso88591' then begin
if ATo=EncodingCPIso1 then begin
Result:=UTF8ToISO_8859_1(Result);
Encoded := true;
end
else if ATo='iso885915' then begin
else if ATo=EncodingCPIso15 then begin
Result:=UTF8ToISO_8859_15(Result);
Encoded := true;
end
else if ATo='iso88592' then begin
else if ATo=EncodingCPIso2 then begin
Result:=UTF8ToISO_8859_2(Result);
Encoded := true;
end
else if ATo='cp1250' then begin
else if ATo=EncodingCP1250 then begin
Result:=UTF8ToCP1250(Result);
Encoded := true;
end
else if ATo='cp1251' then begin
else if ATo=EncodingCP1251 then begin
Result:=UTF8ToCP1251(Result);
Encoded := true;
end
else if ATo='cp1252' then begin
else if ATo=EncodingCP1252 then begin
Result:=UTF8ToCP1252(Result);
Encoded := true;
end
else if ATo='cp1253' then begin
else if ATo=EncodingCP1253 then begin
Result:=UTF8ToCP1253(Result);
Encoded := true;
end
else if ATo='cp1254' then begin
else if ATo=EncodingCP1254 then begin
Result:=UTF8ToCP1254(Result);
Encoded := true;
end
else if ATo='cp1255' then begin
else if ATo=EncodingCP1255 then begin
Result:=UTF8ToCP1255(Result);
Encoded := true;
end
else if ATo='cp1256' then begin
else if ATo=EncodingCP1256 then begin
Result:=UTF8ToCP1256(Result);
Encoded := true;
end
else if ATo='cp1257' then begin
else if ATo=EncodingCP1257 then begin
Result:=UTF8ToCP1257(Result);
Encoded := true;
end
else if ATo='cp1258' then begin
else if ATo=EncodingCP1258 then begin
Result:=UTF8ToCP1258(Result);
Encoded := true;
end
else if ATo='cp850' then begin
else if ATo=EncodingCP850 then begin
Result:=UTF8ToCP850(Result);
Encoded := true;
end
else if ATo='cp852' then begin
else if ATo=EncodingCP852 then begin
Result:=UTF8ToCP852(Result);
Encoded := true;
end
else if ATo='cp866' then begin
else if ATo=EncodingCP866 then begin
Result:=UTF8ToCP866(Result);
Encoded := true;
end
else if ATo='cp874' then begin
else if ATo=EncodingCP874 then begin
Result:=UTF8ToCP874(Result);
Encoded := true;
end
{$IFNDEF DisableAsianCodePages}
else if ATo = 'cp936' then
else if ATo = EncodingCP936 then
begin
Result := UTF8ToCP936(Result);
Encoded := True;
end
else if ATo = 'cp950' then
else if ATo = EncodingCP950 then
begin
Result := UTF8ToCP950(Result);
Encoded := True;
end
else if ATo = 'cp949' then
else if ATo = EncodingCP949 then
begin
Result := UTF8ToCP949(Result);
Encoded := True;
end
else if ATo = 'cp932' then
else if ATo = EncodingCP932 then
begin
Result := UTF8ToCP932(Result);
Encoded := True;
end
{$ENDIF}
else if ATo='koi8' then begin
else if ATo=EncodingCPKOI8 then begin
Result:=UTF8ToKOI8(Result);
Encoded := true;
end