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

Стандартните процедури за сравнение на низове на Delphi RTL сравняват низове чрез ASCII подреждане.

Що се отнася до мен, лексикографското подреждане се основава само на буквите от азбуката; това е системата за подреждане, използвана в речниците.

Има ли собствена функция на Delphi за сравняване на низове по лексикографски ред? Засега нямам нужда от сложно решение за поддръжка на азбуки, различни от английската.

АКТУАЛИЗИРАНЕ

Не знам подробното правило за лексикографската система за подреждане, но знам едно от правилата, тоест тази система за подреждане ще третира например a-b е по-голямо от 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
Говорихте за естествени функции, така че функциите *coll на MSVCRT бяха първите уцелих. Но тези, които можете да използвате само на платформа 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
@David Heffernan, не знам подробното правило за лексикографската система за подреждане, но знам едно от правилата, тоест тази система за подреждане ще третира например ‹b›a-b‹/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