Unicode-lajittelualgoritmi
Unicode Lajittelu Algoritmi (lyhyt UCA ) on Unicode Consortium julkaisi algoritmin varten jousille välillä Unicode vertailla hahmoa ja olla aakkosjärjestyksessä . Sitä pidetään tarkoituksella niin avoimena, että kielikohtaiset ominaisuudet ja käyttäjien erityispyynnöt voidaan ottaa huomioon. Taulukko, jossa on vakioarvot lajittelua varten, on saatavana myös algoritmille, Default Unicode Collation Element Table (DUCET). Lisäksi Common Locale Data Repository tarjoaa vastaavat taulukot monille muille kielille, joita käytetään esimerkiksi ICU- projektin toteutuksessa.
olosuhteissa
Unicodeen koodattujen merkkien suuri määrä vaikeuttaa merkkijonojen lajittelua. Esimerkiksi ei ole selvää, pitäisikö kreikkalaisista kirjaimista tehtyjen sanojen edetä kyrillisistä kirjaimista tai päinvastoin. Yksittäisten merkkien koodausjärjestys ei myöskään aina vastaa haluttua lajittelujärjestystä.
Eri kielillä on erilaisia ideoita yksittäisten kirjainten järjestyksestä. Esimerkiksi saksankielisissä sanastoissa sanat å lajitellaan ikään kuin tavallinen a, kun taas skandinaavisissa kielissä å on erillinen kirjain, joka tulee z: n jälkeen. Tällaisia eroja voi esiintyä jopa kielellä, esimerkiksi saksaksi, jossa ä: tä käsitellään joskus a: na, joskus kuin ae: na.
Sattuu myös, että ei ole helppoa lajitella yksittäisten merkkien mukaan. In perinteinen espanjalainen The suunnatun graafin ch käsitellään erillisen kirjeen, joka tulee välillä c ja d.
Lisäksi sovelluksesta riippuen voidaan asettaa tiettyjä lisävaatimuksia, esimerkiksi St. kuten Santa voidaan lajitella.
tarina
Algoritmin laatijat ovat Mark Davis ja Ken Whistler. Ensimmäinen versio julkaistiin 30. maaliskuuta 1997. Syyskuusta 2012 lähtien algoritmin versio 26 on käytettävissä. Kanssa ISO 14651 on samanlainen algoritmi ISO , joka kuitenkin tarjoaa vähemmän mahdollisuuksia. Uudempien versioiden kanssa lisättiin yhä enemmän määritysvaihtoehtoja, kuten mahdollisuus lajitella numeroita numeerisesti.
algoritmi
Kahden merkkijonon vertaamiseksi algoritmi etenee eri vaiheissa ja vertaa kahta merkkijonoa eri tasoilla. Tasojen lukumäärä ja merkitys voidaan periaatteessa valita vapaasti, mutta standardi on kolme tasoa, joilla on seuraavat merkitykset:
Taso 1: peruskirjaimet
Ensimmäisellä tasolla merkkijonoja verrataan niiden peruskirjainten mukaan. Aksentit, isot ja pienet kirjaimet, välimerkit ja vastaavat jätetään yleensä huomiotta. Joten tällä tasolla sanat roskat ja roskat katsotaan samoiksi, mutta sana muuli tulee niiden eteen.
Taso 2: aksentti
Jos sanat vastaavat peruskirjaimia, seuraava askel on verrata aksentteja. Lähes kaikilla kielillä ensimmäinen ero etsitään vasemmalta oikealle ja lajitellaan sitten kiinteän järjestyksen mukaan: ensin kirjaimet ilman aksenttia, muut aksentit kiinteässä järjestyksessä. Tämä johtaa tilaukseen cote - coté - côte - côté. Kanadan ranska on poikkeus: perinteisesti viimeinen ero lajitellaan tähän: cote - côte - coté - côté.
Taso 3: isot ja pienet kirjaimet
Jos sanat vastaavat myös aksentteja, käytetään isoja ja pieniä kirjaimia, jolloin pienet kirjaimet lajitellaan yleensä ennen isoja kirjaimia.
Lisää tasoja
Tarvittaessa voidaan seurata muita tasoja vielä tarkemman erottelun mahdollistamiseksi. Usein johtopäätös lajitellaan yksittäisten koodipisteiden mukaan. Tämä varmistaa, että kaksi eri merkkijonoa lajitellaan aina samassa järjestyksessä.
Painojen lajittelu
Merkkijonojen vertaamiseksi algoritmi toimittaa binäärisen lajitteluavaimen Unicode-merkkeistä koostuvalle merkkijonolle. Tätä avainta käytetään sitten todellisessa lajittelualgoritmissa vertailuun. Lajitteluavaimen määrittämiseksi käytetään taulukkoa, jossa luetellaan yksittäisten merkkien binääripainot tai kaikkien tasojen merkkiyhdistelmät, ns. Lajitteluelementtitaulukko . Merkinnälle voidaan määrittää useita painoja per taso. Paino 0000tarkoittaa, että vastaava merkki tulisi jättää huomiotta tällä tasolla. Paino on laskettava merkkeille, joita ei ole lueteltu taulukossa. Vakiotaulukossa tämä pätee vain CJKV-merkkeihin ; algoritmi annetaan myös painojen laskemiseksi.
Ensinnäkin merkkijono jaetaan mahdollisimman pitkiin paloihin, joiden taulukossa on merkintä, ja niihin liittyvät painot luetaan taulukosta. Nämä painot kiinnitetään aluksi toisiinsa kullekin tasolle, 0000jätetään ne pois. Kanadan ja ranskan lajittelussa tason 2 järjestys muutetaan. Yksittäisten tasojen avaimet on lopulta 0000kiinnitetty toisiinsa yhden lajitteluavaimen muodostamiseksi.
Esimerkkejä
Suurin osa näistä esimerkeistä lajitteluelementtitaulukon merkinnöille on otettu DUCET-versiosta 6.1.0. Kolmen ensimmäisen tason painot ilmoitetaan tässä heksadesimaalilukuina . Painot on erotettu pisteillä ja suljettu hakasulkeisiin.
Yksinkertaiset kirjaimet
| merkki | Painot | merkintä |
|---|---|---|
| a | [15D4.0020.0002] |
15D4 on a-kirjaimen paino.
|
| A. | [15D4.0020.0008] |
Isot kirjaimet A eroavat kolmannen tason pienestä a: sta. |
| b | [15EA.0020.0002] |
15EA on peruskirjaimen b paino, tämä tulee a: n jälkeen (jossa on tilaa käyttäjäkohtaisille lisäyksille).
|
| c | [1602.0020.0002] |
|
| z | [187A.0020.0002] |
|
| a | [190E.0020.0002] |
Latinalaisen aakkosen kirjaimia seuraa muut aakkoset, kuten kreikkalaiset. |
Aksentoidut kirjaimet, ligatuurit ja kirjainyhdistelmät
Diakriittisillä merkeillä varustetut kirjaimet on jaettu perusmerkkiin ja seuraaviin yhdistelmämerkkeihin .
| merkki | Painot | merkintä |
|---|---|---|
| à | [15D4.0020.0002], [0000.0035.0002] |
A-painon jälkeen tulee hautakohteen paino , jota ei oteta huomioon tasolla 1 ( 0000).
|
| å | [15D4.0020.0002], [0000.0043.0002] |
Yleensä å nähdään a: n muunnoksena. |
| å | [187B.0020.0002] |
Vuonna Ruotsin eri paino on käytetty, tässä seuraa å omana kirjeen jälkeen z. |
| Ä | [15D4.0020.0002], [0000.0047.0002] |
|
| æ | [15D4.0020.0004], [0000.0139.0004], [1631.0020.001F] |
æ: tä kohdellaan ensimmäisellä tasolla kuin ae. |
| ch | [1603.0020.0002] |
Perinteisessä espanjan kielessä ch: tä käsitellään kuin kirjainta, joka tulee c: n jälkeen. |
Ohjausmerkit, symbolit ja numerot
| merkki | Painot | merkintä |
|---|---|---|
| LRM | [0000.0000.0000] |
Ohjausmerkit , kuten B. vasemmalta oikealle -merkit jätetään kokonaan huomiotta. |
| $ | [15A4.0020.0002] |
|
| € | [15BC.0020.0002] |
|
| 1 | [15CB.0020.0002] |
|
| 2 | [15CC.0020.0002] |
|
| ² | [15CC.0020.0014] |
Isojen kirjainten tavoin yläindeksinumerot eroavat vain kolmannen tason perusluvusta. |
| 9 | [15D3.0020.0002] |
Välimerkit ja välilyönnit
Välimerkkien ja välilyöntien kohdalla on useita vaihtoehtoja painojen valitsemiseksi.
Monissa toteutuksissa, kuten PHP , nämä merkit painotetaan taulukossa esitetyllä tavalla.
| merkki | Painot | merkintä |
|---|---|---|
| tavallinen tila | [020A.0020.0002] |
|
| murtumaton tila | [020A.0020.001B] |
Murtumaton tila erotetaan tavallisesta vasta tasolla 3. |
| Yhdysviiva-miinus (-) | [020E.0020.0002] |
|
| Puolipiste (-) | [0216.0020.0002] |
|
| Pilkku (,) | [0221.0020.0002] |
|
| Kaksoispiste (:) | [0237.0020.0002] |
|
| Huutomerkki (!) | [025E.0020.0002] |
|
| Aika (.) | [0273.0020.0002] |
|
| Apostrofi (') | [02EA.0020.0002] |
|
| Apostrofi (') | [02EC.0020.0002] |
|
| Lainausmerkit (") | [02F1.0020.0002] |
|
| Lainausmerkit (") | [02F2.0020.0002] |
|
| Lainausmerkit (") | [02F4.0020.0002] |
|
| aukko kannatin (() | [02FB.0020.0002] |
|
| sulku ()) | [02FC.0020.0002] |
|
| Vinoviiva (/) | [0372.0020.0002] |
Alkuperäisen suunnitelman mukaan näitä merkkejä ei pidetty lainkaan vakiokäyttäytymisenä, eli [0000.0000.0000]annettiin heille painoa kuin kontrollimerkkejä .
Algoritmin nykyisessä versiossa vaaditaan jotain samanlaista kuin vakiokäyttäytyminen: Myös tässä [0000.0000.0000]valitaan paino , mutta lisätään neljäs taso, jossa painoksi käytetään tason 1 tosiasiallisesti määritettyä arvoa, kun taas muut merkit käyttävät tämän tason arvoa saat korkeimman mahdollisen arvon FFFF.
On myös muita vaihtoehtoja, joista käyttäjä voi valita.
Sopeutuminen
Vakiotaulukkoa voidaan mukauttaa monin tavoin:
- Yksittäisiin painoihin voidaan tehdä kielikohtaisia muutoksia ja lisätä painojen kanssa muita merkkikombinaatioita. Asianmukaisesti mukautetut taulukot ovat jo saatavilla monille kielille. Käyttäjän määrittelemille mukautuksille on määritettävä erillinen syntakse, joka voidaan kääntää taulukoksi sopivilla lajittelupainoilla sopivilla ohjelmilla.
- Tarvittaessa voit määrittää, että lajittelu tulisi suorittaa toisella tasolla merkkijonon päästä, kuten kanadan ranskaksi on tapana. Periaatteessa tämä on mahdollista myös muilla tasoilla, vaikka sillä ei olisikaan järkevää.
- Voit valita vertailun tasojen määrän. Tätä lukua kutsutaan voimaksi. Oletusarvo on 3, mutta jos taulukossa on painot usealle tasolle, voidaan valita suurempi luku. Pienempi määrä voidaan kuitenkin valita myös, jos lyhyellä lajittelunäppäimellä on etusija yksityiskohtaiseen lajitteluun nähden.
- Tietyille merkeille (enimmäkseen välilyönteille ja välimerkkeille) voit valita painojen eri vaihtoehtojen välillä.
Standardi kuvaa monia muita vaihtoehtoja.
vaihtoehtoja
On olemassa useita menetelmiä algoritmin muuttamiseksi, esimerkiksi lyhyempien binaaristen avainten saamiseksi. Joten on mahdollista tehdä ilman erotimia 0000, kunhan painot laskevat tasolta tasolle. On myös muita vaihtoehtoja, jotka johtavat suurempiin säästöihin.
esimerkki
Termit Nina , Nino , NINO , Niño ja Ninu on asetettava aakkosjärjestykseen. Ne jaotellaan yksittäisiin kirjaimiin, niiden paino määritetään ja lajitteluavain sitten kootaan. Avaimessa ensimmäiselle tasolle kuuluva osa on korostettu sinisellä, toinen taso on vihreä ja kolmas keltainen.
Nina tulee ensin, sana eroaa jo ensimmäisellä tasolla seuraavasta sanasta Nino (alleviivaus). Tämä puolestaan vastaa NINO: ta kahdella ensimmäisellä tasolla; ero johtaa vain kolmanteen tasoon. Seuraavalla sanalla Niño avain on pidempi kuin muilla sanoilla toisen ja kolmannen tason tilden takia; tämä tilde tarjoaa myös ensimmäisen eron edelliseen sanaan. Viimeinen on Ninu, joka taas eroaa edellisistä sanoista ensimmäisellä tasolla.
Jos nämä sanat lajitellaan koodipisteiden mukaan , tuloksena olisi sekvenssi NINO - Nina - Nino - Ninu - Niño.
| sana | purettu | Lajitteluavain | |||
|---|---|---|---|---|---|
| Nina | N | i | n | a |
1734.16B2.1734.15D4.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
|
[1734.0020.0008] |
[16B2.0020.0002] |
[1734.0020.0002] |
[15D4.0020.0002]
|
||
| Nino | N | i | n | O |
1734.16B2.1734.1756.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
|
[1734.0020.0008] |
[16B2.0020.0002] |
[1734.0020.0002] |
[1756.0020.0002]
|
||
| NINO | N | I. | N | O |
1734.16B2.1734.1756.0000.0020.0020.0020.0020.0000.0008.0008.0008.0008
|
[1734.0020.0008] |
[16B2.0020.0008] |
[1734.0020.0008] |
[1756.0020.0008]
|
||
| Niño | N | i | ñ | O |
1734.16B2.1734.1756.0000.0020.0020.0020.004E.0020.0000.0008.0002.0002.0002.0002
|
[1734.0020.0008] |
[16B2.0020.0002] |
[1734.0020.0002], [0000.004E.0002] |
[1756.0020.0002]
|
||
| Ninu | N | i | n | u |
1734.16B2.1734.181B.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
|
[1734.0020.0008] |
[16B2.0020.0002] |
[1734.0020.0002] |
[181B.0020.0002]
|
||
Hakualgoritmi
Algoritmin osia voidaan käyttää myös tekstihakuihin , esimerkiksi jos ss-haun pitäisi myös löytää sanoja ß: llä. Tässä tapauksessa ottelu tulisi tunnistaa, kun hakusana ja mahdollinen osuma vastaavat ensimmäisellä tasolla.
nettilinkit
- Algoritmin virallinen muotoilu (englanti)
- Algoritmin esittely
- ICU: n käyttöopas: Lajittelun esittely (englanti)
Yksittäiset todisteet
- ^ UCA: n ensimmäinen tarkistus
- ↑ Unicode FAQ: Lajittelu Mitkä ovat erot UCA: n ja ISO 14651: n välillä?
- ↑ allkeys.txt , versio 6.1.0
- ↑ PHP-käsikirja : Collator-luokka
- ↑ UCA, versio 1 , osioiden muuttujien lajitteluelementit