Sorteringsalgoritmer:
Der findes et utal af sorteringsalgoritmer, der hver for sig har deres
fordele. Quicksort er godt til ting, der stort set er sorteret i forvejen,
men til at sortere helt usorterede ting, er Quicksort faktisk ret elendig
til. Min personlige favorit hedder Mergesort, som ved gode implementationer
har god performance i stort set alle sammenhæng - bortset fra at den bruger
noget memory til at holde styr på alle de tekster, der skal sorteres.
De fleste, der skal sortere noget, bruger den sorteringsfunktion, som ens
værktøj tilbyder, og her er TStringList.CustomSort en mulighed.
Tegnsæt:
Alt i en computer gemmes som bytes, som hver indeholder en værdi på 0-255.
Når man vil gemme tekst i en computer, bruges et tegnsæt, og et tegnsæt er
simpelthen en måde at oversætte bogstaver til bytes. De mest kendte er:
ASCII: Kun værdierne 32-127 bruges, og æøåÆØÅ har ingen talrepresentation.
Bogstavet A svarer til talværdien 65, og det lille a har talværdien 97.
ANSI: Svarer nogenlunde til ISO8859-1 og er standardtegnsættet i en dansk
WIndows
ISO8859-1: Bruges i Danmark og USA til internet formål. Alle tegn gemmes som
et byte, og et Æ har værdien 198.
Unicode: (også kaldet UCS-2) bruger to bytes ad gangen, som sammensættes til
en talværdi 0-65535. Værdierne 0-255 svarer til ISO8859-1, men som man nok
kan regne ud, indeholder Unicode en masse tegn, som simpelthen ikke findes
i ISO8859-1, bl.a. græske, russiske, japanske tegn osv.
UCS: Bruger talværdier fra 0 til 2 milliarder, og indeholder derfor endnu
flere tegn end Unicode. Værdierne 0-65535 svarer til Unicode tegnsættet.
Man kalder det "UCS-4", når man bruger 4 bytes for hvert tegn, og "UCS-2",
når man bruger 2 bytes til hvert tegn. På den måde svarer UCS-2 til
Unicode.
UTF-8: En anden måde at skrive UCS tegn på. Ideen er, at bruge et variabelt
antal bytes per tegn. ASCII tegn skrives på almindelig måde med 1 byte per
tegn, og talværdier på 0-127. UCS tegn med værdier over 127 skrives med 2
eller flere bytes, og således fylder et Æ to bytes, der har værdierne 195
og 134.
De fleste tegnsæt, der ikke er nævnt her, opfører sig enten som UTF-8, ved
at de bruger et variabelt antal bytes per tegn, eller også benytter de 1
byte per tegn ligesom ISO8859-1, bortset fra at talværdierne 128-255
referer til andre tegn.
Eftersom du bruger Delphi, vil jeg anbefale dig at lave
sammenligningsfunktionen med variable af typen widestring. Disse kan
indeholde unicode tegn (UCS-2). Hvis du f.eks. har:
var s:widestring;
så har ord(s[3]) en værdi på mellem 0 og 65535.
Her vil tabellen fra mit forrige indlæg være defineret således:
var tabel:array[widechar] of integer;
Du skal derfor konvertere fra dine forskellige andre tegnsæt til
unicode/widechar, og her skal du så vide, hvilke tegnsæt dine data ligger
i, og hvordan disse kan konverteres. Delphi konverterer automatisk fra
maskinens default 8-bit tegnsæt til unicode ved hjælp af Windows's
funktioner, når du tildeler en string til en widestring, men det er jo ikke
sikkert, at det er det, du ønsker. Generelt skal du være forsigtig med at
overlade konvertering til Windows, da mange af Windows's konverteringer er
afhængig af maskinens indstillinger og derfor ikke altid vil opføre sig
ens, når du installerer programmerne ude hos slutbrugerne.
Såvidt jeg forstår, vil du sortere noget, der både indholder islandsk tekst
og engelsk tekst, så du bliver derfor nødt til at afgøre med dig selv,
hvordan engelske tekster og islandske tekster skal flettes ind i hinanden
ved sorteringen, og så tildele talværdier derefter.
Windows har selv indbyggede faciliteter til tekst-sammenligning, men jeg er
ikke sikker på, hvordan det fungerer, når du har flere sprog blandet
sammen, og mine personlige erfaringer siger mig, at slutbrugeren også kunne
have specielle ønsker. Men her findes der ganske kompetente folk på news
serveren forums.borland.com i sektionen
borland.public.delphi.internationalization, hvor jeg synes du bør spørge.
Jeg håber jeg har hjulpet dig lidt på vej, men en komplet besvarelse kræver
nok et bedre kendskab til, hvad du forsøger at gøre.
Hilsen,
Lars Dybdahl.
--
Dybdahl Engineering:
http://dybdahl.dk/
Delphi brugergruppen DAPUG:
http://dapug.dk/