NTFS писал(а):Я все же думаю, что это баг
Это не баг, посмотрели бы исходники. Как я уже писал выше, для винды вызываются API функции CharLowerBuff и CharUpperBuff, а для линукса используются таблицы преобразования регистра LowerCaseTable и UpperCaseTable, так вот эта таблицы для символов начиная с #192 заполняются для кодовой страницы
ISO 8859-1. Если посмотрите эту таблицу, то увидите что на месте Ч и ч стоят символы × и ÷ которые естественно никуда не преобразуются, а как были так и остаются в тексте, примерно то же самое и для Я и я, только для я соответствует символ ÿ, и для верхнего регистра подставляется Y.
Так что можно сказать что FPC не имеет встроенной поддержки CP1251.
Для тех кому лень рыться в исходниках, скопипастил их. Сами функции:
Код: Выделить всё
function AnsiUpperCase(const s: string): string;{$ifdef SYSUTILSINLINE}inline;{$endif}
begin
result:=widestringmanager.UpperAnsiStringProc(s);
end;
function AnsiLowerCase(const s: string): string;{$ifdef SYSUTILSINLINE}inline;{$endif}
begin
result:=widestringmanager.LowerAnsiStringProc(s);
end;
Установка менеджера для линукса:
Код: Выделить всё
procedure InitInternationalGeneric;
begin
fillchar(SysLocale,sizeof(SysLocale),0);
{ keep these routines out of the executable? }
{$ifndef FPC_NOGENERICANSIROUTINES}
{ don't override a previously installed widestring manager }
if not assigned(widestringmanager.UpperAnsiStringProc) then
widestringmanager.UpperAnsiStringProc:=@GenericAnsiUpperCase;
if not assigned(widestringmanager.LowerAnsiStringProc) then
widestringmanager.LowerAnsiStringProc:=@GenericAnsiLowerCase;
if not assigned(widestringmanager.CompareStrAnsiStringProc) then
widestringmanager.CompareStrAnsiStringProc:=@GenericAnsiCompareStr;
if not assigned(widestringmanager.CompareTextAnsiStringProc) then
widestringmanager.CompareTextAnsiStringProc:=@GenericAnsiCompareText;
if not assigned(widestringmanager.StrCompAnsiStringProc) then
widestringmanager.StrCompAnsiStringProc:=@GenericAnsiStrComp;
if not assigned(widestringmanager.StrICompAnsiStringProc) then
widestringmanager.StrICompAnsiStringProc:=@GenericAnsiStrIComp;
if not assigned(widestringmanager.StrLCompAnsiStringProc) then
widestringmanager.StrLCompAnsiStringProc:=@GenericAnsiStrLComp;
if not assigned(widestringmanager.StrLICompAnsiStringProc) then
widestringmanager.StrLICompAnsiStringProc:=@GenericAnsiStrLIComp;
if not assigned(widestringmanager.StrLowerAnsiStringProc) then
widestringmanager.StrLowerAnsiStringProc:=@GenericAnsiStrLower;
if not assigned(widestringmanager.StrUpperAnsiStringProc) then
widestringmanager.StrUpperAnsiStringProc:=@GenericAnsiStrUpper;
{$endif FPC_NOGENERICANSIROUTINES}
end;
Сами функции преобразования:
Код: Выделить всё
function GenericAnsiUpperCase(const s: string): string;
var
len, i: integer;
begin
len := length(s);
SetLength(result, len);
for i := 1 to len do
result[i] := UpperCaseTable[ord(s[i])];
end;
function GenericAnsiLowerCase(const s: string): string;
var
len, i: integer;
begin
len := length(s);
SetLength(result, len);
for i := 1 to len do
result[i] := LowerCaseTable[ord(s[i])];
end;
Заполнение таблиц преобразования:
Код: Выделить всё
Procedure InitAnsi;
Var
i : longint;
begin
{ Fill table entries 0 to 127 }
for i := 0 to 96 do
UpperCaseTable[i] := chr(i);
for i := 97 to 122 do
UpperCaseTable[i] := chr(i - 32);
for i := 123 to 191 do
UpperCaseTable[i] := chr(i);
Move (CPISO88591UCT,UpperCaseTable[192],SizeOf(CPISO88591UCT));
for i := 0 to 64 do
LowerCaseTable[i] := chr(i);
for i := 65 to 90 do
LowerCaseTable[i] := chr(i + 32);
for i := 91 to 191 do
LowerCaseTable[i] := chr(i);
Move (CPISO88591LCT,LowerCaseTable[192],SizeOf(CPISO88591UCT));
end;
Ну и сами таблицы преобразования для ISO 8859-1:
Код: Выделить всё
{ upper case translation table for character set ISO 8859/1 Latin 1 }
CPISO88591UCT: array[192..255] of char =
( #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,
#192, #193, #194, #195, #196, #197, #198, #199,
#200, #201, #202, #203, #204, #205, #206, #207,
#208, #209, #210, #211, #212, #213, #214, #247,
#216, #217, #218, #219, #220, #221, #222, #89 );
{ lower case translation table for character set ISO 8859/1 Latin 1 }
CPISO88591LCT: array[192..255] of char =
( #224, #225, #226, #227, #228, #229, #230, #231,
#232, #233, #234, #235, #236, #237, #238, #239,
#240, #241, #242, #243, #244, #245, #246, #215,
#248, #249, #250, #251, #252, #253, #254, #223,
#224, #225, #226, #227, #228, #229, #230, #231,
#232, #233, #234, #235, #236, #237, #238, #239,
#240, #241, #242, #243, #244, #245, #246, #247,
#248, #249, #250, #251, #252, #253, #254, #255 );