Сортировка русского текста. Баг в TStringList?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сортировка русского текста. Баг в TStringList?

Сообщение Kubanych » 18.11.2009 11:55:24

Кажется имеется ошибка в TStringList при сортировке русского текста.
Строю простейшее приложение с двумя TMemo и кнопкой. Вот код:

procedure TForm1.Button1Click(Sender: TObject);
var
strList: TStringList;
begin
strList:= TStringList.Create;
strList.Duplicates:= dupAccept;
strList.AddStrings(Memo1.Lines);
strList.Sort;
Memo2.Clear;
Memo2.Lines.AddStrings(strList);
strList.Free;
end;

В Memo1 ввожу фамилии:

Аршавин
Погребняк
Быстров

В Memo2 строки выводятся в виде:

Быстров
Аршавин
Погребняк

В Delphi (CodeGear RAD Studio 2009) этот же код работает правильно.

Уважаемые эксперты, что скажете?

Прежде чем отправлять сообщение об ошибке в lazarus bugtracker, хотелось бы посоветоваться
со знающими людьми.
Kubanych
новенький
 
Сообщения: 73
Зарегистрирован: 15.10.2008 10:02:18

Re: Сортировка русского текста. Баг в TStringList?

Сообщение Mr.Smart » 18.11.2009 13:15:56

Kubanych
По умолчанию TStringList использует следующую функцию, которая работает с чистыми Ansi строками, а в LCL используется кодировка UTF-8 :wink:
стандартная функция
Код: Выделить всё
Function TStringList.DoCompareText(const s1,s2 : string) : PtrInt;
  begin
     if FCaseSensitive then
       result:=AnsiCompareStr(s1,s2)
     else
      result:=AnsiCompareText(s1,s2);
  end;

Можно воспользоваться методом CustomSort передав ему в качестве параметра свою функцию проверки на равенство.
На пример:
Код: Выделить всё
function MyFunc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result:=WideCompareText(UTF8Decode(List[Index1]),UTF8Decode(List[Index2]));
end;

....
  List.CustomSort(@MyFunc);
....


з.ы. Я это багом не считаю!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru