Delphi: как сравнивать строки по их лексикографическому порядку (порядку словаря)?

Стандартные процедуры сравнения строк Delphi RTL сравнивают строки в порядке ASCII.

Насколько я понимаю, лексикографическая упорядоченность основана только на буквах алфавита; это система упорядочивания словарей.

Есть ли собственная функция Delphi для сравнения строк в лексикографическом порядке? На данный момент мне не нужно сложное решение для поддержки алфавитов, кроме английского.

ОБНОВИТЬ

Я не знаю правила подробностей о лексикографической системе упорядочивания, но я знаю одно из правил, то есть эта система упорядочивания будет рассматривать, например, что ab больше, чем aa . Однако это было основано на моих наблюдениях за английскими словарями в моей руке. Возможно, есть еще правила, которые меня не волнуют.


person Astaroth    schedule 22.06.2014    source источник
comment
Итак, это вопрос Delphi (ANSI или Unicode?) Или FPC (ANSI)? Вы все время говорите о Delphi, но в конце концов использовали теги FPC. Кроме того, на какие платформы вы ориентируетесь (в MSVCRT есть набор функций для того, что вам нужно, но вам нужно настроить таргетинг на Windows)?   -  person TLama    schedule 22.06.2014
comment
Неважно, Delphi это или FPC, Ansi, Unicode или UTF, потому что я просто хочу изучить реализацию кода, а затем изменить его в соответствии со своими потребностями. Я говорю об английских алфавитах, а не об алфавитах других языков.   -  person Astaroth    schedule 22.06.2014
comment
Вы говорили о нативных функциях, поэтому функции MSVCRT *coll были первыми Я ударил. Но их можно использовать только на платформе Windows.   -  person TLama    schedule 22.06.2014
comment
В английском алфавите нет проблем с сопоставлением, а лексикографический порядок строк такой же, как и без учета регистра; функция AnsiCompareText выполняет сравнение строк без учета регистра.   -  person kludg    schedule 22.06.2014
comment
Вы имеете в виду, что хотите, чтобы ваша функция сравнения возвращала это 'a''123456789 b''c', потому что символы перед 'b' не являются буквами? Если нет, можете ли вы отредактировать свой вопрос, чтобы привести несколько конкретных примеров того, как собственные RTL-функции Delphi не соответствуют вашим потребностям?   -  person    schedule 22.06.2014
comment
Простые определения см. Здесь   -  person Jan Doggen    schedule 22.06.2014
comment
Ваш вопрос не имеет смысла. В любом случае ASCII состоит только из английских букв. Вы действительно имели в виду ASCII? Более того, английские буквы появляются в ASCII в алфавитном порядке. Я думаю, вам нужно сделать шаг назад и понять, что вы действительно ищете.   -  person David Heffernan    schedule 23.06.2014
comment
@ Дэвид Хеффернан, я не знаю подробного правила о лексикографической системе упорядочивания, но я знаю одно из правил, а именно, эта система упорядочивания будет обрабатывать, например, ‹b› ab ‹/b› больше, чем ‹b› aa ‹/b›. Однако это основано на моих наблюдениях за английскими словарями в моей руке. Возможно, есть еще правило, что меня это не волнует. Вот почему я спрашиваю об этом здесь.   -  person Astaroth    schedule 23.06.2014


Ответы (1)


Функция AnsiCompareText выполняет сравнение строк без учета регистра с учетом порядка сопоставления языкового стандарта системы.

Просто чтобы убедиться, что я выполнил следующий тест в системе с кодовой страницей 1251:

procedure Test;
var
  S1, S2: string;

begin
  S1:= 'им';
  S2:= 'ём';
  Writeln(IntToHex(Integer(S1[1]), 4));    // 0438
  Writeln(IntToHex(Integer(S2[1]), 4));    // 0451
  Writeln(AnsiCompareText(S1, S2));        // 1 (means S1 > S2)
end;

Вы можете видеть, что буква 'и' имеет код (0x0438) меньше, чем буква 'ё' (0x0451), но в русском алфавите 'ё' предшествует 'и', а функция AnsiCompareText сравнивает 'ё' и 'и' согласно правила русского алфавита, а не числовые значения их кодов.

person kludg    schedule 22.06.2014