Meglett a sorbarendezési probléma oka, kibogarásztam a forrásokból. Megosztanám, hátha valaki más is beleütközik majd a jövőben ebbe a dologba...
Röviden: Az említett UTF8Osszehasonlitas függvénybe egy WideCompareStr függvényt kell beilleszteni, és működni fog a sorbarendezés mind Windows-on, mind Linuxon.
function UTF8Osszehasonlitas(List: TStringList;Index1: Integer;Index2: Integer):Integer;
begin
Result := WideCompareStr(WideString(List[Index1]),WideString(List[Index2]));
end;
// Stringlist sorbarendezése:
SL.CustomSort(@UTF8Osszehasonlitas);
Bővebben: A LazUTF8-beli UTF8CompareStrCollated függvény Linux esetében ezt a WideCompareStr függvényt hívja meg alapból, Windows esetében viszont egy AnsiCompareStr(UTF8ToSys(S1), UTF8ToSys(S2)) nevű függvényt. Az UTF8ToSys függvény a régebbi Lazarus és Freepascal alatt átkonvertálták a string-eket Ansi-vé, az új viszont meghagyja őket UTF8-nak. Maga az AnsiCompareStr végső soron meghívott egy Win32 specifikus
CompareStringA
függvényt, és az sorba is rendezi az Ansi kódolású stringeket. Viszont most UTF8-akat kapott, emiatt rossz eredményeket adott vissza. A WideCompareStr viszont összességében egy CompareStringW nevű Win32 specifikus függvényt hív meg, ami meg UTF8 stringeket vár, és emiatt jól rendez sorba. A LazUTF8.pas unit tartalmának változtatása nélkül nem találtam más, működő megoldást a problémára.